2023年程序?qū)嶒?yàn)多線程編程實(shí)驗(yàn)報(bào)告_第1頁(yè)
2023年程序?qū)嶒?yàn)多線程編程實(shí)驗(yàn)報(bào)告_第2頁(yè)
2023年程序?qū)嶒?yàn)多線程編程實(shí)驗(yàn)報(bào)告_第3頁(yè)
2023年程序?qū)嶒?yàn)多線程編程實(shí)驗(yàn)報(bào)告_第4頁(yè)
2023年程序?qū)嶒?yàn)多線程編程實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

程序?qū)嶒?yàn)二:11-多線程編程實(shí)驗(yàn)專業(yè)班級(jí)實(shí)驗(yàn)日期5.21姓名學(xué)號(hào)實(shí)驗(yàn)一(p284:11-thread.c)1、軟件功能描述創(chuàng)建3個(gè)線程,讓3個(gè)線程重用同一個(gè)執(zhí)行函數(shù),每個(gè)線程都有5次循環(huán),可以當(dāng)作5個(gè)小任務(wù),每次循環(huán)之間會(huì)有隨即等待時(shí)間(1-10s)意義在于模擬每個(gè)任務(wù)到達(dá)的時(shí)間是的沒有任何的特定規(guī)律。2、程序流程設(shè)計(jì)3.部分程序代碼注釋(關(guān)鍵函數(shù)或代碼)#include<pthread.h>#include<stdio.h>#include<stdlib.h>#defineT_NUMBER3#defineP_NUMBER5#defineTIME10.0void*thrd_func(void*arg){intthrd_num=(int)arg;intdelay_time=0;intcount=0;printf("Thread%disstaraing\n",thrd_num);for(count=0;count<P_NUMBER;count++){delay_time=(int)(rand()*TIME/(RAND_MAX))+1;sleep(delay_time);printf("\tTH%d:job%ddelay=%d\n",thrd_num,count,delay_time);}printf("%dfinished\n",thrd_num);pthread_exit(NULL);}intmain(){pthread_tthread[T_NUMBER];intno=0,res;void*thrd_ret;srand(time(NULL));for(no=0;no<T_NUMBER;no++){res=pthread_create(&thread[no],NULL,thrd_func,(void*)no);if(res!=0){printf("Creayth%dfaild\n",no);exit(res);}}printf("success\nwaiting\n");for(no=0;no<T_NUMBER;no++){res=pthread_join(thread[no],&thrd_ret);if(!res){printf("t%djoined\n",no);}else{printf("T%djoinedfaild\n",no);}}return0;}4.編譯、運(yùn)營(yíng)方法及結(jié)果(抓屏)5.結(jié)果分析由運(yùn)營(yíng)結(jié)果可以看出,創(chuàng)建線程、釋放資源按照順序,而每個(gè)線程的運(yùn)營(yíng)和結(jié)束是獨(dú)立與并行的。?實(shí)驗(yàn)二(p287:11-thread_mutex.c)1、軟件功能描述在實(shí)驗(yàn)1的基礎(chǔ)上通過互斥鎖,使原本獨(dú)立,無(wú)序的多個(gè)線程可以按順序進(jìn)行2、程序流程設(shè)計(jì)3.部分程序代碼注釋(關(guān)鍵函數(shù)或代碼)#include<stdio.h>#include<stdlib.h>#include<pthread.h>#defineTHREAD_NUMBER3/*線程數(shù)*/#defineREPEAT_NUMBER3 ?/*每個(gè)線程的小任務(wù)數(shù)*/#defineDELAY_TIME_(tái)LEVELS10.0 /*小任務(wù)間的最大時(shí)間間隔*/pthread_mutex_tmutex;void*thrd_func(void*arg)//線程函數(shù)例程{intthrd_num=(int)arg;intdelay_time=0,count=0;intres;//互斥鎖上鎖res=pthread_mutex_lock(&mutex);if(res){printf("Thread%disstarting\n",thrd_num);pthread_exit(NULL);}printf("Thread%disstarting\n",thrd_num);for(count=0;count<REPEAT_NUMBER;count++){delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1;sleep(delay_time);printf("\tThread%d:job%ddelay=%d\n",thrd_num,count,delay_time);}printf("Thread%dfinished\n",thrd_num);pthread_exit(NULL);}intmain(void){pthread_tthread[THREAD_NUMBER];intno=0,res;void*thrd_ret;srand(time(NULL));pthread_mutex_init(&mutex,NULL);for(no=0;no<THREAD_NUMBER;no++){res=pthread_create(&thread[no],NULL,thrd_func,(void*)no);if(res!=0){printf("Createthread%dfailed\n",no);exit(res);}}printf("Createthreadssuccess\nWaitingforthreadstofinish...\n");/*這里的問題很奇怪,按照書上程序敲打,出現(xiàn)的線程一方面是2而非0,沒有按照書上所說(shuō):與創(chuàng)建順序相同,但是在這里體現(xiàn)了互斥性,由于后面的釋放資源程序從0開始,而一開始為線程2占用資源,所以無(wú)法釋放資源,導(dǎo)致程序卡死,最后修改為先釋放線程2的資源,之后則可以依次顯示*/for(no=2;no<THREAD_NUMBER;no--){res=pthread_join(thread[no],&thrd_ret);if(!res){printf("Thread%djoined\n",no);}else{printf("Thread%djoinfailed\n",no);}pthread_mutex_unlock(&mutex);}pthread_mutex_destroy(&mutex);return0;}4.編譯、運(yùn)營(yíng)方法及結(jié)果(抓屏)5.結(jié)果分析實(shí)驗(yàn)結(jié)果體現(xiàn)了互斥性,3個(gè)線程有序運(yùn)營(yíng)。?實(shí)驗(yàn)三(P291:11-thread_sem.c)1、軟件功能描述該程序在實(shí)驗(yàn)1的基礎(chǔ)上,用信號(hào)量同步機(jī)制實(shí)現(xiàn)3個(gè)線程的有序執(zhí)行,運(yùn)用pv操作來(lái)控制執(zhí)行順序,達(dá)成執(zhí)行的順序和創(chuàng)建的順序剛好相反。2、程序流程設(shè)計(jì)3.部分程序代碼注釋(關(guān)鍵函數(shù)或代碼)……#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<semaphore.h>#defineTHREAD_NUMBER?3#defineREPEAT_NUMBER 3#defineDELAY_TIME_LEVELS?10.0sem_tsem[THREAD_NUMBER];void*thrd_func(void*arg){intthrd_num=(int)arg;intdelay_time=0;intcount=0;sem_wait(&sem[thrd_num]);printf("Thread%disstarting\n",thrd_num);for(count=0;count<REPEAT_NUMBER;count++){delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1;slee(cuò)p(delay_time);printf("\tThread%d:job%ddelay=%d\n",thrd_num,count,delay_time);}printf("Thread%dfinished\n",thrd_num);pthread_exit(NULL);}intmain(void){pthread_tthread[THREAD_NUMBER];intno=0,res;void*thrd_ret;srand(time(NULL));for(no=0;no<THREAD_NUMBER;no++){sem_init(&sem[no],0,0);res=pthread_create(&thread[no],NULL,thrd_func,(void*)no);if(res!=0){printf("Createthread%dfailed\n",no);exit(res);}}printf("Createthreadssuccess\nWaitingforthreadstofinish...\n");sem_post(&sem[THREAD_NUMBER-1]);for(no=THREAD_NUMBER-1;no>=0;no--){res=pthread_join(thread[no],&thrd_ret);if(!res){printf("Thread%djoined\n",no);}else{printf("Thread%djoinfailed\n",no);}sem_post(&sem[(no+THREAD_NUMBER-1)%THREAD_NUMBER]);}for(no=0;no<THREAD_NUMBER;no++){sem_destroy(&sem[no]);}return0;}編譯、運(yùn)營(yíng)方法及結(jié)果(抓屏)5.結(jié)果分析程序運(yùn)營(yíng)、結(jié)束都是按照順序進(jìn)行的,只是順序和創(chuàng)建的順序剛好相反。

實(shí)驗(yàn)四(p295:11-thread_attr.c)1、軟件功能描述創(chuàng)建一個(gè)線程,具有綁定和分離屬性,主線程通過finish——flag標(biāo)志變量來(lái)獲得線程結(jié)束的消息,不調(diào)用pthread_join函數(shù)2、程序流程設(shè)計(jì)3.部分程序代碼注釋(關(guān)鍵函數(shù)或代碼)#include<stdio.h>#include<stdlib.h>#include<pthread.h>#defineREPEAT_NUMBER 3#defineDELAY_TIME_(tái)LEVELS?10.0intfinish_flag=0;void*thrd_func(void*arg){intdelay_time=0;intcount=0;printf("Thisstarting\n");for(count=0;count<REPEAT_NUMBER;count++){delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX)+1);slee(cuò)p(delay_time);printf("\tTh:job%ddelay=%d\n",count,delay_time);}printf("Thfinished\n");finish_flag=1;pthread_exit(NULL);}intmain(void){pthread_tthread;pthread_attr_tattr;intno=0,res;void*thrd_ret;srand(time(NULL));res=pthread_attr_init(&attr);if(res!=0){printf("Createattributefailed\n");exit(res);}res=pthread_attr_setscope(&attr,PTHREAD_SCOPE_(tái)SYSTEM);res+=pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_(tái)DETACHED);if(res!=0){printf("Settingat(yī)tributefailed\n");exit(res);}res=pthread_create(&th,&attr,thrd_func,NULL);if(res!=0){printf("Createthfailed\n");exit(res);}pthread_attr_destroy(&attr);printf("Createthsuccess\n");while(!finish_flag){printf("Waitingforthtofinish...\n");sleep(2);}return0;}4.編譯、運(yùn)營(yíng)方法及結(jié)果(抓屏)5.結(jié)果分析由結(jié)果可以看出,這個(gè)創(chuàng)建的線程具有綁定好而分離屬性,并且主線程通過一個(gè)finish_glag標(biāo)志變量賴獲得線程結(jié)束的消息,但是線程在運(yùn)營(yíng)結(jié)束之后似乎沒有收回系統(tǒng)資源,由于程序運(yùn)營(yíng)前和程序運(yùn)營(yíng)后使用“free”命令查看內(nèi)存使用情況,發(fā)現(xiàn)使用的內(nèi)存并不一致。?實(shí)驗(yàn)五(p298:11-producer-customer.c)1、軟件功能描述信號(hào)量的意義,在程序生產(chǎn)中和消費(fèi)過程中是進(jìn)行的,并且生產(chǎn)者的速度比消費(fèi)者的速度平均快兩倍。生產(chǎn)者一次生產(chǎn)一個(gè)單元產(chǎn)品,消費(fèi)者一次消費(fèi)一個(gè)單元的產(chǎn)品。2、程序流程設(shè)計(jì)3.部分程序代碼注釋(關(guān)鍵函數(shù)或代碼)#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<pthread.h>#include<errno.h>#include<semaphore.h>#include<sys/ipc.h>#defineMYFIFO?"myfifo"#define?BUFFER_SIZE 3#define?UNIT_SIZE?5#define RUN_TIME?30#define DELAY_TIME_LEVELS 5.0intfd;time_tend_time;?sem_tmutex,full,avail;void*producer(void*arg){intreal_write;intdelay_time=0;while(time(NULL)<end_time){delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_M(jìn)AX)/2.0)+1;sleep(delay_time);sem_wait(&avail);sem_wait(&mutex);printf("\nProducer:delay=%d\n",delay_time);if((real_write=write(fd,"hello",UNIT_SIZE))==-1){if(errno==EAGAIN){printf("TheFIFOhasnotbeenreadyet.Pl(wèi)easetrylatter\n");}}else{printf("Write%dtotheFIFO\n",real_write);}sem_post(&full);sem_post(&mutex);}pthread_exit(NULL);}void*customer(void*arg){unsignedcharread_buffer[UNIT_SIZE];intreal_read;intdelay_time;while(time(NULL)<end_time){delay_time=(int)(rand()*DELAY_TIME_(tái)LEVELS/(RAND_M(jìn)AX))+1;sleep(delay_time);sem_wait(&full);sem_wait(&mutex);memset(read_buffer,0,UNIT_SIZE);printf("\nCustomer:delay=%d\n",delay_time);if((real_read=read(fd,read_buffer,UNIT_SIZE))==-1){if(errno==EAGAIN){printf("Nodatayet\n");}}printf("Read%sfromFIFO\n",read_buffer);sem_post(&avail);sem_post(&mutex);}pthread_exi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論