版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操作系統(tǒng)課程設(shè)計(jì)說(shuō)明書(shū) 目 錄目 錄2用多線程同步方法解決生產(chǎn)者消費(fèi)者問(wèn)題41. 設(shè)計(jì)題目與要求41.1設(shè)計(jì)題目41.2設(shè)計(jì)要求42.設(shè)計(jì)思想及系統(tǒng)平臺(tái)42.1設(shè)計(jì)思想42.2系統(tǒng)平臺(tái)及使用語(yǔ)言53.數(shù)據(jù)結(jié)構(gòu)與模塊說(shuō)明54.源程序清單75.運(yùn)行結(jié)果與運(yùn)行情況136.調(diào)試過(guò)程137.總結(jié)14本科生課程設(shè)計(jì)成績(jī)?cè)u(píng)定表15課程設(shè)計(jì)任務(wù)書(shū)學(xué)生姓名: 專業(yè)班級(jí): 指導(dǎo)教師: 工作單位: 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 題目: 用多線程同步方法解決生產(chǎn)者消費(fèi)者問(wèn)題 (producer-consumer problem) 初始條件:1 操作系統(tǒng):linux2 程序設(shè)計(jì)語(yǔ)言:c語(yǔ)言3 有界緩沖區(qū)內(nèi)設(shè)有20個(gè)存儲(chǔ)單元,其
2、初值為0。放入取出的數(shù)據(jù)項(xiàng)按增序設(shè)定為120這20個(gè)整型數(shù)。要求完成的主要任務(wù): (包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說(shuō)明書(shū)撰寫(xiě)等具體要求) 1技術(shù)要求:1)為每個(gè)生產(chǎn)者消費(fèi)者產(chǎn)生一個(gè)線程,設(shè)計(jì)正確的同步算法2)每個(gè)生產(chǎn)者和消費(fèi)者對(duì)有界緩沖區(qū)進(jìn)行操作后,即時(shí)顯示有界緩沖區(qū)的當(dāng)前全部?jī)?nèi)容、當(dāng)前指針位置和生產(chǎn)者消費(fèi)者線程的自定義標(biāo)識(shí)符。3)生產(chǎn)者和消費(fèi)者各有兩個(gè)以上。4)多個(gè)生產(chǎn)者或多個(gè)消費(fèi)者之間須共享對(duì)緩沖區(qū)進(jìn)行操作的函數(shù)代碼。2 設(shè)計(jì)說(shuō)明書(shū)內(nèi)容要求:1)設(shè)計(jì)題目與要求2)總的設(shè)計(jì)思想及系統(tǒng)平臺(tái)、語(yǔ)言、工具等。3)數(shù)據(jù)結(jié)構(gòu)與模塊說(shuō)明(功能與流程圖)4)給出用戶名、源程序名、目標(biāo)程序名和源程序及
3、其運(yùn)行結(jié)果。(要注明存儲(chǔ)各個(gè)程序及其運(yùn)行結(jié)果的主機(jī)ip地址和目錄。)5)運(yùn)行結(jié)果與運(yùn)行情況(提示: (1)有界緩沖區(qū)可用數(shù)組實(shí)現(xiàn)。(2)編譯命令可用:cc -lpthread -o 目標(biāo)文件名源文件名(3)多線程編程方法參見(jiàn)附件。)3. 調(diào)試報(bào)告:1)調(diào)試記錄2)自我評(píng)析和總結(jié)上機(jī)時(shí)間安排:18周一 五 08:0 12:00 指導(dǎo)教師簽名: 年 月 日系主任(或責(zé)任教師)簽名: 年 月 日用多線程同步方法解決生產(chǎn)者消費(fèi)者問(wèn)題1. 設(shè)計(jì)題目與要求1.1設(shè)計(jì)題目 解決生產(chǎn)者消費(fèi)者(bounded - buffer problem)問(wèn)題1.2設(shè)計(jì)要求1) 每個(gè)生產(chǎn)者和消費(fèi)者對(duì)有界緩沖區(qū)進(jìn)行操作后,即
4、時(shí)顯示有界緩沖區(qū)的全部?jī)?nèi)容、當(dāng)前指針位置和生產(chǎn)者消費(fèi)者線程的標(biāo)識(shí)符。2) 生產(chǎn)者和消費(fèi)者各有兩個(gè)以上。3) 多個(gè)生產(chǎn)者或多個(gè)消費(fèi)者之間須共享對(duì)緩沖區(qū)進(jìn)行操作的函數(shù)代碼。2.設(shè)計(jì)思想及系統(tǒng)平臺(tái)2.1設(shè)計(jì)思想生產(chǎn)者進(jìn)程與消費(fèi)者進(jìn)程是經(jīng)典的同步互斥關(guān)系。系統(tǒng)創(chuàng)建兩類進(jìn)程:proceducer ()和consumer(),分別用來(lái)描述生產(chǎn)者和消費(fèi)者的行為。生產(chǎn)者與消費(fèi)者問(wèn)題是指若干進(jìn)程通過(guò)循環(huán)緩沖池區(qū)交換數(shù)據(jù)。生產(chǎn)者進(jìn)程不斷向循環(huán)緩沖池區(qū)中寫(xiě)入數(shù)據(jù)(即生產(chǎn)數(shù)據(jù)),而消費(fèi)者進(jìn)程不斷從循環(huán)緩沖池區(qū)中讀出數(shù)據(jù)(即消費(fèi)數(shù)據(jù))。循環(huán)緩沖池共有n個(gè)緩沖區(qū),緩沖區(qū)可以暫存一個(gè)產(chǎn)品,任何時(shí)刻只能有一個(gè)進(jìn)程可以對(duì)循環(huán)緩
5、沖池進(jìn)行操作。只要緩沖區(qū)未滿,生產(chǎn)者就可以把產(chǎn)品送入緩沖區(qū);只要緩沖區(qū)未空,消費(fèi)者就可以從緩沖區(qū)中取走物品。為了解決生產(chǎn)者和消費(fèi)者問(wèn)題,應(yīng)該設(shè)置信號(hào)量和變量如下: full: 滿緩沖區(qū)資源信號(hào)量 ,初值為0;empty:空緩沖區(qū)資源信號(hào)量 ,初值為n;in: 生產(chǎn)者指針,初值均為0;out: 消費(fèi)者指針,均為0;mutex:緩沖區(qū)操作的互斥信號(hào)量,初值為1利用互斥信號(hào)量mutex實(shí)現(xiàn)諸進(jìn)程對(duì)緩沖池的互斥使用,利用信號(hào)量empty和full分別表示緩沖池中空緩沖池和滿緩沖區(qū)的數(shù)量。2.2系統(tǒng)平臺(tái)及使用語(yǔ)言1)操作系統(tǒng):linux2)程序設(shè)計(jì)語(yǔ)言:c語(yǔ)言3)編譯器:gcc3.數(shù)據(jù)結(jié)構(gòu)與模塊說(shuō)明3.
6、1程序自定義函數(shù)1、void produce(struct sem_info * );這個(gè)函數(shù)是生產(chǎn)者進(jìn)行的生產(chǎn)過(guò)程,為所有的生產(chǎn)者所共享。結(jié)構(gòu)體指針用來(lái)接收生產(chǎn)者線程創(chuàng)建時(shí)傳來(lái)的生產(chǎn)者的個(gè)人信息。2、void consumer(struct sem_info * );這個(gè)函數(shù)是消費(fèi)者進(jìn)行的生產(chǎn)過(guò)程,為所有的消費(fèi)者所共享。結(jié)構(gòu)體指針用來(lái)接收消費(fèi)者線程創(chuàng)建時(shí)傳來(lái)的消費(fèi)者的個(gè)人信息。3、void setproduce(void); 這個(gè)函數(shù)是用來(lái)設(shè)置生產(chǎn)者的個(gè)數(shù)和他們的名字。4、void setconsumer(void);這個(gè)函數(shù)是用來(lái)設(shè)置消費(fèi)者的個(gè)數(shù)和他們的名字。5、void activept
7、hread(int);這個(gè)函數(shù)是用來(lái)創(chuàng)建生產(chǎn)者線程,int型參數(shù)為生產(chǎn)者的個(gè)數(shù)。6、void activecthread(int);這個(gè)函數(shù)是用來(lái)創(chuàng)建生產(chǎn)者線程,int型參數(shù)為生產(chǎn)者的個(gè)數(shù)。7、int gettime(void);這個(gè)函數(shù)返回來(lái)一個(gè)整數(shù),作為線程的sleep()函數(shù)的參數(shù)。8、void myscanf(void);這個(gè)函數(shù)用來(lái)獲取設(shè)置生產(chǎn)者和消費(fèi)者的個(gè)數(shù)時(shí)的整數(shù),確保這個(gè)數(shù)字在0到max_buffer之間。3.2系統(tǒng)函數(shù)調(diào)用 線程linux系統(tǒng)下的多線程遵循posix線程接口,稱為pthread。編寫(xiě)linux下的多線程程序,需要使用頭文件pthread.h,連接時(shí)需要使用庫(kù)l
8、ibpthread.a。linux下pthread的實(shí)現(xiàn)是通過(guò)系統(tǒng)調(diào)用clone()來(lái)實(shí)現(xiàn)的。clone()是linux所特有的系統(tǒng)調(diào)用,它的使用方式類似fork。函數(shù)pthread_create用來(lái)創(chuàng)建一個(gè)線程,它的原型為:extern int pthread_create _p (pthread_t *_thread, _const pthread_attr_t *_attr,void *(*_start_routine) (void *), void *_arg);第一個(gè)參數(shù)為指向線程標(biāo)識(shí)符的指針,第二個(gè)參數(shù)用來(lái)設(shè)置線程屬性,第三個(gè)參數(shù)是線程運(yùn)行函數(shù)的起始地址,最后一個(gè)參數(shù)是運(yùn)行函數(shù)的參
9、數(shù)。第二個(gè)參數(shù)我們也設(shè)為空指針,這樣將生成默認(rèn)屬性的線程。當(dāng)創(chuàng)建線程成功時(shí),函數(shù)返回0,若不為0則說(shuō)明創(chuàng)建線程失敗,常見(jiàn)的錯(cuò)誤返回代碼為eagain和einval。前者表示系統(tǒng)限制創(chuàng)建新的線程,例如線程數(shù)目過(guò)多了;后者表示第二個(gè)參數(shù)代表的線程屬性值非法。創(chuàng)建線程成功后,新創(chuàng)建的線程則運(yùn)行參數(shù)三和參數(shù)四確定的函數(shù),原來(lái)的線程則繼續(xù)運(yùn)行下一行代碼。函數(shù)pthread_join用來(lái)等待一個(gè)線程的結(jié)束。函數(shù)原型為:extern int pthread_join _p (pthread_t _th, void *_thread_return);第一個(gè)參數(shù)為被等待的線程標(biāo)識(shí)符,第二個(gè)參數(shù)為一個(gè)用戶定義的指
10、針,它可以用來(lái)存儲(chǔ)被等待線程的返回值。這個(gè)函數(shù)是一個(gè)線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到被等待的線程結(jié)束為止,當(dāng)函數(shù)返回時(shí),被等待線程的資源被收回。一個(gè)線程的結(jié)束有兩種途徑,一種是函數(shù)結(jié)束了,調(diào)用它的線程也就結(jié)束了;另一種方式是通過(guò)函數(shù)pthread_exit來(lái)實(shí)現(xiàn)。它的函數(shù)原型為:extern void pthread_exit _p (void *_retval) _attribute_ (_noreturn_);唯一的參數(shù)是函數(shù)的返回代碼,只要pthread_join中的第二個(gè)參數(shù)thread_return不是null,這個(gè)值將被傳遞給 thread_return。最后要說(shuō)明的是,一
11、個(gè)線程不能被多個(gè)線程等待,否則第一個(gè)接收到信號(hào)的線程成功返回,其余調(diào)用pthread_join的線程則返回錯(cuò)誤代碼esrch。信號(hào)量信號(hào)量本質(zhì)上是一個(gè)非負(fù)的整數(shù)計(jì)數(shù)器,它被用來(lái)控制對(duì)公共資源的訪問(wèn)。當(dāng)公共資源增加時(shí),調(diào)用函數(shù)sem_post()增加信號(hào)量。只有當(dāng)信號(hào)量值大于時(shí),才能使用公共資源,使用后,函數(shù)sem_wait()減少信號(hào)量。函數(shù)sem_trywait()和函數(shù)pthread_ mutex_trylock()起同樣的作用,它是函數(shù)sem_wait()的非阻塞版本。它們都在頭文件 /usr/include/semaphore.h中定義。信號(hào)量的數(shù)據(jù)類型為結(jié)構(gòu)sem_t,它本質(zhì)上是一個(gè)
12、長(zhǎng)整型的數(shù)。函數(shù)sem_init()用來(lái)初始化一個(gè)信號(hào)量。它的原型為:extern int sem_init _p (sem_t *_sem, int _pshared, unsigned int _value);sem為指向信號(hào)量結(jié)構(gòu)的一個(gè)指針;pshared不為時(shí)此信號(hào)量在進(jìn)程間共享,否則只能為當(dāng)前進(jìn)程的所有線程共享;value給出了信號(hào)量的初始值。函數(shù)sem_post( sem_t *sem )用來(lái)增加信號(hào)量的值。當(dāng)有線程阻塞在這個(gè)信號(hào)量上時(shí),調(diào)用這個(gè)函數(shù)會(huì)使其中的一個(gè)線程不在阻塞,選擇機(jī)制同樣是由線程的調(diào)度策略決定的。函數(shù)sem_wait( sem_t *sem )被用來(lái)阻塞當(dāng)前線程直
13、到信號(hào)量sem的值大于0,解除阻塞后將sem的值減一,表明公共資源經(jīng)使用后減少。函數(shù)sem_trywait ( sem_t *sem )是函數(shù)sem_wait()的非阻塞版本,它直接將信號(hào)量sem的值減一。函數(shù)sem_destroy(sem_t *sem)用來(lái)釋放信號(hào)量sem。3.3流程圖設(shè)置生產(chǎn)者消費(fèi)者信息創(chuàng)建生產(chǎn)者生產(chǎn)者生產(chǎn)緩存區(qū)空?緩存區(qū)可進(jìn)?創(chuàng)建生產(chǎn)者生產(chǎn)者生產(chǎn)緩存區(qū)空?緩存區(qū)可進(jìn)?程序結(jié)束失敗否否否失敗否4.源程序清單 #include #include #include #include #include #include #include #define max_buffer 2
14、0int in=0,out=0;int pnum,cnum;int sheng=1;int xiao=1;int i;char buffermax_buffer;struct sem_info pthread_t semid; char * name; *psemmax_buffer,*csemmax_buffer;sem_t mutex,full,empty;/生產(chǎn)者開(kāi)始void produce(struct sem_info * rpsem) printf(第%d個(gè)生產(chǎn)者創(chuàng)建完成!.n,sheng+);while(1) int s1; sleep(gettime(); sem_wait(&
15、empty); sem_wait(&mutex); if(in19) in=0; srand(unsigned)time(null)+in); bufferin=rand()%100+10; printf(i am the produce ,the pid:%d ,my name is:%s ,my products is:%dn,&rpsem-semid,&rpsem-name,bufferin); printf(the in point is:%dn,in); printf(the contents of the buffer is:n); for(s1=0;s119) out=0; pr
16、intf(i am the consumer ,the pid:%d ,my name is:%s ,i will consume the products:%dn,&rcsem-semid,&rcsem-name,bufferout); bufferout=0; printf(the out point is:%dn,out); printf(after consume the buffercontents is:n); for(s2=0;s2max_buffer;s2+) printf(%d|,buffers2); out+; printf(n-消費(fèi)結(jié)束-nn); sem_post(&mu
17、tex); sem_post(&empty); void setproduce() printf(請(qǐng)輸入生產(chǎn)者的個(gè)數(shù):); pnum=myscanf(); for(i=0;isemid=0; printf(請(qǐng)輸入第%d個(gè)生產(chǎn)者的名字:,i+1); scanf(%s,&psemi-name); getchar(); void setconsumer() printf(請(qǐng)輸入消費(fèi)者的個(gè)數(shù):); cnum=myscanf(); for(i=0;isemid=0; printf(請(qǐng)輸入第%d個(gè)消費(fèi)者的名字:,i+1); scanf(%s,&csemi-name); getchar(); int act
18、ivepthread(int number) int k1=0; int ret1; for(k1=0;k1semid,0,sizeof(psemk1-semid); ret1=pthread_create(&psemk1-semid,null,(void *)produce,psemk1); if(ret1!=0) printf(創(chuàng)建第%d個(gè)生產(chǎn)者線程失敗!,k1+1); return -1; return 0;int activecthread(int number) int k2=0; int ret2; for(k2=0;k2semid,0,sizeof(csemk2-semid);
19、ret2=pthread_create(&csemk2-semid,null,(void *)consumer,csemk2); if(ret2!=0) printf(創(chuàng)建第%d個(gè)消費(fèi)者線程失敗!,k2+1); return -1; return 0;int gettime() int j; srand(unsigned)time(null); j=rand()%4+1; return j; int myscanf() int num=-99999; while(1) scanf(%d,&num); getchar(); if(num=20) printf(請(qǐng)輸入1到20的一個(gè)整數(shù): ); e
20、lse break; return num;int main() int key1,key2; sem_init(&mutex,0,1); sem_init(&full,0,0); sem_init(&empty,0,max_buffer); setproduce(); setconsumer(); key1=activecthread(cnum); key2=activepthread(pnum); if(key1=0&key2=0) pthread_join(psem0-semid,null);/等待第一個(gè)生產(chǎn)者線程的結(jié)束,也就是讓主線程處于無(wú)限等待中,不會(huì)過(guò)早的退出 5. 編譯及運(yùn)行結(jié)果
21、編譯命令:gcc -o pvpv.c -pthread執(zhí)行命令:./pv運(yùn)行結(jié)果:rootlocalhost root# gcc pv.c -o pv -pthreadrootlocalhost root# ./pv請(qǐng)輸入生產(chǎn)者的個(gè)數(shù):3請(qǐng)輸入第1個(gè)生產(chǎn)者的名字:a請(qǐng)輸入第2個(gè)生產(chǎn)者的名字:b請(qǐng)輸入第3個(gè)生產(chǎn)者的名字:c請(qǐng)輸入消費(fèi)者的個(gè)數(shù):2請(qǐng)輸入第1個(gè)消費(fèi)者的名字:s1請(qǐng)輸入第2個(gè)消費(fèi)者的名字:s2第1個(gè)消費(fèi)者創(chuàng)建完成!.第2個(gè)消費(fèi)者創(chuàng)建完成!.第1個(gè)生產(chǎn)者創(chuàng)建完成!.第2個(gè)生產(chǎn)者創(chuàng)建完成!.第3個(gè)生產(chǎn)者創(chuàng)建完成!.i am the produce ,the pid:134517488 ,m
22、y name is:a ,my products is:70the in point is:0the contents of the buffer is:70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:88the in point is:1the contents of the buffer is:70|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the pr
23、oduce ,the pid:134517520 ,my name is:c ,my products is:93the in point is:2the contents of the buffer is:70|88|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:70the out point is:0after consume the buffercontents is:0|88|93|0
24、|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-消費(fèi)結(jié)束- i am the consumer ,the pid:134517552 ,my name is:s2 ,i will consume the products:88the out point is:1after consume the buffercontents is:0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-消費(fèi)結(jié)束- i am the produce ,the pid:134517488 ,my name is:a ,my products is:46the in
25、point is:3the contents of the buffer is:0|0|93|46|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:70the in point is:4the contents of the buffer is:0|0|93|46|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517520 ,my name i
26、s:c ,my products is:50the in point is:5the contents of the buffer is:0|0|93|46|70|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:93the out point is:2after consume the buffercontents is:0|0|0|46|70|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
27、-消費(fèi)結(jié)束- i am the consumer ,the pid:134517552 ,my name is:s2 ,i will consume the products:46the out point is:3after consume the buffercontents is:0|0|0|0|70|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-消費(fèi)結(jié)束- i am the produce ,the pid:134517488 ,my name is:a ,my products is:46the in point is:6the contents of the bu
28、ffer is:0|0|0|0|70|50|46|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:37the in point is:7the contents of the buffer is:0|0|0|0|70|50|46|37|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517520 ,my name is:c ,my products is:81the in p
29、oint is:8the contents of the buffer is:0|0|0|0|70|50|46|37|81|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:70the out point is:4after consume the buffercontents is:0|0|0|0|0|50|46|37|81|0|0|0|0|0|0|0|0|0|0|0|-消費(fèi)結(jié)束- i am the consumer ,th
30、e pid:134517552 ,my name is:s2 ,i will consume the products:50the out point is:5after consume the buffercontents is:0|0|0|0|0|0|46|37|81|0|0|0|0|0|0|0|0|0|0|0|-消費(fèi)結(jié)束- i am the produce ,the pid:134517488 ,my name is:a ,my products is:69the in point is:9the contents of the buffer is:0|0|0|0|0|0|46|37|8
31、1|69|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:89the in point is:10the contents of the buffer is:0|0|0|0|0|0|46|37|81|69|89|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517520 ,my name is:c ,my products is:67the in point is:11the contents o
32、f the buffer is:0|0|0|0|0|0|46|37|81|69|89|67|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:46the out point is:6after consume the buffercontents is:0|0|0|0|0|0|0|37|81|69|89|67|0|0|0|0|0|0|0|0|-消費(fèi)結(jié)束- i am the consumer ,the pid:134517552 ,my n
33、ame is:s2 ,i will consume the products:37the out point is:7after consume the buffercontents is:0|0|0|0|0|0|0|0|81|69|89|67|0|0|0|0|0|0|0|0|-消費(fèi)結(jié)束- i am the produce ,the pid:134517488 ,my name is:a ,my products is:37the in point is:12the contents of the buffer is:0|0|0|0|0|0|0|0|81|69|89|67|37|0|0|0|0
34、|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:21the in point is:13the contents of the buffer is:0|0|0|0|0|0|0|0|81|69|89|67|37|21|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517520 ,my name is:c ,my products is:102the in point is:14the contents of the buffer is:
35、0|0|0|0|0|0|0|0|81|69|89|67|37|21|102|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:81the out point is:8after consume the buffercontents is:0|0|0|0|0|0|0|0|0|69|89|67|37|21|102|0|0|0|0|0|-消費(fèi)結(jié)束- i am the consumer ,the pid:134517552 ,my name is:s2 ,i
36、 will consume the products:69the out point is:9after consume the buffercontents is:0|0|0|0|0|0|0|0|0|0|89|67|37|21|102|0|0|0|0|0|-消費(fèi)結(jié)束- i am the produce ,the pid:134517488 ,my name is:a ,my products is:50the in point is:15the contents of the buffer is:0|0|0|0|0|0|0|0|0|0|89|67|37|21|102|50|0|0|0|0|-
37、生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:16the in point is:16the contents of the buffer is:0|0|0|0|0|0|0|0|0|0|89|67|37|21|102|50|16|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517520 ,my name is:c ,my products is:40the in point is:17the contents of the buffer is:0|0|0|0
38、|0|0|0|0|0|0|89|67|37|21|102|50|16|40|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:89the out point is:10after consume the buffercontents is:0|0|0|0|0|0|0|0|0|0|0|67|37|21|102|50|16|40|0|0|-消費(fèi)結(jié)束- i am the consumer ,the pid:134517552 ,my name is:s2 ,i wil
39、l consume the products:67the out point is:11after consume the buffercontents is:0|0|0|0|0|0|0|0|0|0|0|0|37|21|102|50|16|40|0|0|-消費(fèi)結(jié)束- 6調(diào)試過(guò)程6.1調(diào)試工具簡(jiǎn)介vi(visual editor)進(jìn)入vi,直接執(zhí)行 vi文件名,即可:此刻屏幕上會(huì)出現(xiàn) vi 的編輯窗口,同時(shí) vi 會(huì)將文件復(fù)制一份至記憶體中的緩沖區(qū) (buffer)。vi會(huì)保留在磁盤中的文件不變,而先對(duì)緩沖區(qū)的檔案作編輯,編輯完成后,我們可以決定是否要取代原來(lái)舊有的文件。編譯命令:gcc -o
40、目標(biāo)文件名源文件名執(zhí)行命令:./ 目標(biāo)文件名6.2、調(diào)試問(wèn)題分析因?yàn)樯a(chǎn)者-消費(fèi)者方案很常用,所以在構(gòu)建應(yīng)用程序時(shí)它可能會(huì)出現(xiàn)幾次,這導(dǎo)致了代碼重復(fù)。在設(shè)計(jì)過(guò)程期間多次使用了生產(chǎn)者-消費(fèi)者方案的問(wèn)題。我的解決方案就是創(chuàng)建 consumer 類,其目的是:在應(yīng)用程序中,消除這種代碼重復(fù) 為每個(gè)生產(chǎn)者-消費(fèi)者實(shí)例編寫(xiě)一個(gè)新作業(yè)隊(duì)列和消費(fèi)者進(jìn)程來(lái)解決這個(gè)問(wèn)題。按照要求,生產(chǎn)者生產(chǎn)item,并放置在緩沖區(qū)里,消費(fèi)者從緩沖區(qū)中得到item,并進(jìn)行處理。如果緩沖區(qū)滿,則生產(chǎn)者不能再生產(chǎn),直到緩沖區(qū)有空位,如果緩沖區(qū)空時(shí),消費(fèi)者也不能從緩沖區(qū)中得到item,直到緩沖區(qū)不空。進(jìn)程:buffer,produce
41、r,consumer producer(生產(chǎn)者進(jìn)程): item_type item; while (true) produce(&item); buffer.set(item); consumer(消費(fèi)者進(jìn)程): item_type item; while (true) buffer.get(item); consume(item); 7.總結(jié)本次課程設(shè)計(jì)完成了多進(jìn)程同步方法解決生產(chǎn)者消費(fèi)者問(wèn)題全部過(guò)程,結(jié)果滿足設(shè)計(jì)要求,驗(yàn)證無(wú)誤。設(shè)計(jì)過(guò)程中也遇到不少困難,尤其是關(guān)于多進(jìn)程程序的設(shè)計(jì)實(shí)現(xiàn)。特別需要注意的是由于進(jìn)程的數(shù)據(jù)共享會(huì)帶來(lái)其他一些問(wèn)題,有的變量不能同時(shí)被兩個(gè)進(jìn)程所修改,有的子程序中聲明
42、為static的數(shù)據(jù)更有可能給多進(jìn)程程序帶來(lái)災(zāi)難性的打擊,這些正是編寫(xiě)多進(jìn)程程序時(shí)最需要注意的地方。通過(guò)本次設(shè)計(jì),我較好地掌握了通過(guò)研究linux 的進(jìn)程機(jī)制和信號(hào)量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題的并發(fā)控制全過(guò)程,尤其是對(duì)多進(jìn)程程序設(shè)計(jì)方法有了更深的理解,開(kāi)拓了思路,鍛煉了實(shí)踐動(dòng)手能手,達(dá)到了課程設(shè)計(jì)目的。此外,我也更近一步地了解了os的進(jìn)程機(jī)制和信號(hào)量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題的并發(fā)控制全過(guò)程,尤其是對(duì)多進(jìn)程程序設(shè)計(jì)方法有了更深的理解。在書(shū)本上學(xué)習(xí)有關(guān)進(jìn)程的同步的問(wèn)題只是理論上的說(shuō)法,并沒(méi)有一個(gè)實(shí)際的東西,至少應(yīng)是看得見(jiàn)的,對(duì)其含義也只是處于表面上的理解。這次實(shí)驗(yàn)我才體會(huì)到進(jìn)程同步的真正涵義,以后我會(huì)更進(jìn)一
43、步地學(xué)習(xí),爭(zhēng)取更深入地理解這個(gè)問(wèn)題.本科生課程設(shè)計(jì)成績(jī)?cè)u(píng)定表班級(jí): 姓名: 學(xué)號(hào):序號(hào)評(píng)分項(xiàng)目滿分實(shí)得分1學(xué)習(xí)態(tài)度認(rèn)真、遵守紀(jì)律102設(shè)計(jì)分析合理性103設(shè)計(jì)方案正確性、可行性、創(chuàng)造性204設(shè)計(jì)結(jié)果正確性405設(shè)計(jì)報(bào)告的規(guī)范性106設(shè)計(jì)驗(yàn)收10總得分/等級(jí)評(píng)語(yǔ):注:最終成績(jī)以五級(jí)分制記。優(yōu)(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下為不及格指導(dǎo)教師簽名:2010 年月日ut2apodfxxc02gybkskcww97mrqqwhoj5tl15zt6jipyytycummtarp3v1n5luizi3xh3bhwyreko8d9g7nmzqowpj
44、etldrw08gvs8dsdqqygc3ce7moo2tlf0jf1gk74iuxybmtivr97ckrfvqult5fn2t6mpjr6rbzvpsortzvij5nb5ndvvsr4iwr1twlfkglspzuhrjq3cmzu98euouijdlszqpmvrw9zkupxf8wfug9l2g9277g2rtipa1ypczeuqxpkbhtvdcooqozxuz3vjrzmocijym62zchmeootyes8ebmm932tbz2yo09rtszeys8zrd2yktj8l6jeazvajnfbtrylvsm6ofbftoxvrffn7owiygjlamkunxjybz5rrb7r4vsur9zpfzfmfsjhcfca37lnw2vvlrkn7r8psz1bn6oric5hu5z6hcxayqynpog8duybawqsl20csg06dh2sm8hltgpkicskrgopdpuhbj1lmpk7lydvc6nnmwl3fwhzf
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 淺論多媒體在計(jì)算機(jī)教學(xué)中的應(yīng)用
- 《新能源材料專業(yè)英語(yǔ)》教學(xué)大綱
- 禮儀課題文檔
- 教案 均值不等式教案
- 玉溪師范學(xué)院《土地生態(tài)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 名著經(jīng)典語(yǔ)錄摘要
- 婚姻家庭繼承法教案
- 電影放映機(jī)賬務(wù)處理實(shí)例-記賬實(shí)操
- 房地產(chǎn) -太平山文旅開(kāi)發(fā)規(guī)劃方案融合運(yùn)營(yíng)規(guī)劃提案
- 2024年空氣清新香片項(xiàng)目綜合評(píng)估報(bào)告
- ISO27001:2022信息安全管理手冊(cè)+全套程序文件+表單
- 八年級(jí)歷史上冊(cè)材料題集錦(含答案)
- 國(guó)開(kāi)電大2022年《小學(xué)數(shù)學(xué)教學(xué)研究》形考任務(wù)1-4答
- GB/T 30790.5-2014色漆和清漆防護(hù)涂料體系對(duì)鋼結(jié)構(gòu)的防腐蝕保護(hù)第5部分:防護(hù)涂料體系
- 白蛋白臨床不合理應(yīng)用及其使用指征
- 中小學(xué)教師資格考試成績(jī)復(fù)核申請(qǐng)表
- 五年級(jí)上冊(cè)英語(yǔ)課件M6U1 You can play football well
- 心肌疾病-第九版內(nèi)科學(xué)課件
- 機(jī)械制圖標(biāo)準(zhǔn)件和常用件講義課件
- 工作人員應(yīng)對(duì)火災(zāi)現(xiàn)場(chǎng)應(yīng)急處置卡
- 單分子免疫檢測(cè)課件
評(píng)論
0/150
提交評(píng)論