版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、齊齊哈爾大學(xué)操作系統(tǒng)課程綜合實(shí)踐題目:多進(jìn)程同步方法解決生產(chǎn)者消費(fèi)者問(wèn)題班級(jí):0姓名:0 學(xué)號(hào):0指導(dǎo)教師:0 2011年12 月7日綜合實(shí)踐評(píng)分表班級(jí)0姓名0指導(dǎo)教師0題目:多進(jìn)程同步方法解決生產(chǎn)者消費(fèi)者問(wèn)題 評(píng)分標(biāo)準(zhǔn)評(píng)分標(biāo)準(zhǔn)分?jǐn)?shù)權(quán)重評(píng)分的依據(jù)得分AC選題10選題符合大綱要求,題目較新穎,工作量大選題基本符合大綱要求,工作量適中工作態(tài)度10態(tài)度端正,能主動(dòng)認(rèn)真完成各個(gè)環(huán)節(jié)的工作,不遲到早退,出勤好。能夠完成各環(huán)節(jié)基本工作,出勤較好。存儲(chǔ)結(jié)構(gòu)、算法描述20能正確選擇存儲(chǔ)結(jié)構(gòu),定義準(zhǔn)確,算法流程圖或類C語(yǔ)言描述的算法準(zhǔn)確無(wú)誤能正確選擇存儲(chǔ)結(jié)構(gòu),算法流程圖或類C語(yǔ)言描述的算法基本準(zhǔn)確獨(dú)立解決問(wèn)題的
2、能力10具有獨(dú)立分析、解決問(wèn)題能力,有一定的創(chuàng)造性,能夠獨(dú)立完成軟件的設(shè)計(jì)與調(diào)試工作,程序結(jié)構(gòu)清晰,邏輯嚴(yán)謹(jǐn),功能完善。有一定的分析、解決問(wèn)題能力。能夠在老師指導(dǎo)下完成軟件的設(shè)計(jì)與調(diào)試工作,程序功能較完善。答辨問(wèn)題回答20能準(zhǔn)確回答老師提出的問(wèn)題能基本準(zhǔn)確回答老師提出的問(wèn)題程序運(yùn)行情況10程序運(yùn)行正確、界面清晰,測(cè)試數(shù)據(jù)設(shè)計(jì)合理。程序運(yùn)行正確、界面較清晰,能給出合適的測(cè)試數(shù)據(jù)。綜合實(shí)踐報(bào)告20格式規(guī)范,層次清晰,設(shè)計(jì)思想明確,解決問(wèn)題方法合理,體會(huì)深刻。格式較規(guī)范,設(shè)計(jì)思想基本明確,解決問(wèn)題方法較合理。總分指導(dǎo)教師(簽字): 注:介于A和C之間為B級(jí),低于C為D級(jí)和E級(jí)。按各項(xiàng)指標(biāo)打分后,總分
3、在90100為優(yōu),8089為良,7079為中,6069為及格,60分以下為不及格。多進(jìn)程同步方法解決生產(chǎn)者消費(fèi)者問(wèn)題摘要:本文論述了多進(jìn)程同步方法解決生產(chǎn)者消費(fèi)者問(wèn)題的過(guò)程。該程序使學(xué)生對(duì)操作系統(tǒng)的工作機(jī)制有了初步的了解,其主要目的是使學(xué)生了解和撐握在Linux系統(tǒng)平臺(tái)下的C語(yǔ)言編程,用來(lái)解決實(shí)現(xiàn)生活中遇到的問(wèn)題。并以Linux系統(tǒng)開發(fā)平臺(tái),以及虛擬機(jī)來(lái)實(shí)現(xiàn)。關(guān)鍵字:生產(chǎn)者消費(fèi)者問(wèn)題,Linux系統(tǒng)平臺(tái),虛擬機(jī),信號(hào)量,線程(thread)多進(jìn)程同步方法解決生產(chǎn)者消費(fèi)者問(wèn)題一、課程設(shè)計(jì)所需設(shè)備計(jì)算機(jī)一臺(tái),Red Hat linux9.03系統(tǒng)一套。二、課程設(shè)計(jì)預(yù)期目的通過(guò)研究Linux 的進(jìn)程
4、機(jī)制和信號(hào)量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題的并發(fā)控制。三、課程設(shè)計(jì)任務(wù)用多進(jìn)程同步方法解決生產(chǎn)者-消費(fèi)者問(wèn)題設(shè)計(jì)目的:通過(guò)研究Linux 的進(jìn)程機(jī)制和信號(hào)量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題的并發(fā)控制.說(shuō)明:有界緩沖區(qū)內(nèi)設(shè)有20個(gè)存儲(chǔ)單元,放入/取出的數(shù)據(jù)項(xiàng)設(shè)定為1-20這20個(gè)整型數(shù).設(shè)計(jì)要求:1) 每個(gè)生產(chǎn)者和消費(fèi)者對(duì)有界緩沖區(qū)進(jìn)行操作后,即時(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ù)代碼.四、課程設(shè)計(jì)基本思想多進(jìn)程是一種非常簡(jiǎn)潔的多任務(wù)操作方式。在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給
5、它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來(lái)維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這是一種煩瑣的多任務(wù)工作方式。生產(chǎn)者-消費(fèi)者方案是多進(jìn)程應(yīng)用程序開發(fā)中最常用的構(gòu)造之一。因此困難也在于此。因?yàn)樵谝粋€(gè)應(yīng)用程序中可以多次重復(fù)生產(chǎn)者-消費(fèi)者行為,其代碼也可以如此。設(shè)計(jì)中創(chuàng)建了 Consumer 類,該類通過(guò)在一些多進(jìn)程應(yīng)用程序中促進(jìn)代碼重用以及簡(jiǎn)化代碼調(diào)試和維護(hù)來(lái)解決這個(gè)問(wèn)題。多進(jìn)程應(yīng)用程序通常利用生產(chǎn)者-消費(fèi)者編程方案,其中由生產(chǎn)者進(jìn)程創(chuàng)建重復(fù)性作業(yè),將其傳遞給作業(yè)隊(duì)列,然后由消費(fèi)者進(jìn)程處理作業(yè)。多進(jìn)程是一種使應(yīng)用程序能同時(shí)處理多個(gè)操作的編程技術(shù)。通常有兩種不同類型的多進(jìn)程操作使用多個(gè)進(jìn)程:適時(shí)事件,當(dāng)作業(yè)必須
6、在特定的時(shí)間或在特定的間隔內(nèi)調(diào)度執(zhí)行時(shí);后臺(tái)處理,當(dāng)后臺(tái)事件必須與當(dāng)前執(zhí)行流并行處理或執(zhí)行時(shí);適時(shí)事件的示例包括程序提醒、超時(shí)事件以及諸如輪詢和刷新之類的重復(fù)性操作。后臺(tái)處理的示例包括等待發(fā)送的包或等待處理的已接收的消息。生產(chǎn)者-消費(fèi)者方案很適合于后臺(tái)處理類別的情況。這些情況通常圍繞一個(gè)作業(yè)“生產(chǎn)者”方和一個(gè)作業(yè)“消費(fèi)者”方。當(dāng)然,關(guān)于作業(yè)并行執(zhí)行還有其它考慮事項(xiàng)。在大多數(shù)情況下,對(duì)于使用同一資源的作業(yè),應(yīng)以FCFS的方式按順序處理,這可以通過(guò)使用單進(jìn)程的消費(fèi)者輕松實(shí)現(xiàn)。通過(guò)使用這種方法,使用單個(gè)進(jìn)程來(lái)訪問(wèn)單個(gè)資源,而不是用多個(gè)進(jìn)程來(lái)訪問(wèn)單個(gè)資源。要啟用標(biāo)準(zhǔn)消費(fèi)者,當(dāng)作業(yè)到來(lái)時(shí)創(chuàng)建一個(gè)作業(yè)隊(duì)列
7、來(lái)存儲(chǔ)所有作業(yè)。生產(chǎn)者進(jìn)程通過(guò)將新對(duì)象添加到消費(fèi)者隊(duì)列來(lái)交付這個(gè)要處理的新對(duì)象。然后消費(fèi)者進(jìn)程從隊(duì)列取出每個(gè)對(duì)象,并依次處理。當(dāng)隊(duì)列為空時(shí),消費(fèi)者進(jìn)入休眠。當(dāng)新的對(duì)象添加到空隊(duì)列時(shí),消費(fèi)者會(huì)醒來(lái)并處理該對(duì)象。五詳細(xì)設(shè)計(jì)5.1、調(diào)試問(wèn)題分析為解決生產(chǎn)者/消費(fèi)者問(wèn)題,應(yīng)該設(shè)置兩個(gè)資源信號(hào)量,其中一個(gè)表示空緩沖區(qū)的數(shù)目,用Full表示,其初始值為有界緩沖區(qū)的大小BUFFER_NUM;另一個(gè)表示緩沖區(qū)中產(chǎn)品的數(shù)目,用Empty表示,其初始值為0。另外,由于有界緩沖區(qū)是一個(gè)臨界資源,必須互斥使用,所以還需要再設(shè)置一個(gè)互斥信號(hào)量Mutex,起初值為1。 在生產(chǎn)者/消費(fèi)者問(wèn)題中,信號(hào)量實(shí)現(xiàn)兩種功能。首先,它
8、是生產(chǎn)產(chǎn)品和消費(fèi)產(chǎn)品的計(jì)數(shù)器,計(jì)數(shù)器的初始值是可利用的資源數(shù)目(有界緩沖區(qū)的長(zhǎng)度)。其次,它是確保產(chǎn)品的生產(chǎn)者和消費(fèi)者之間動(dòng)作同步的同步器。 生產(chǎn)者要生產(chǎn)一個(gè)產(chǎn)品時(shí),首先對(duì)資源信號(hào)量Full和互斥信號(hào)量Mutex進(jìn)行P操作,申請(qǐng)資源。如果可以通過(guò)的話,就生產(chǎn)一個(gè)產(chǎn)品,并把產(chǎn)品送入緩沖區(qū)。然后對(duì)互斥信號(hào)量Mutex和資源信號(hào)量Empty進(jìn)行V操作,釋放資源。 消費(fèi)者要消費(fèi)一個(gè)產(chǎn)品時(shí),首先對(duì)資源信號(hào)量Empty和互斥信號(hào)量Mutex進(jìn)行P操作,申請(qǐng)資源。如果可以通過(guò)的話,就從緩沖區(qū)取出一個(gè)產(chǎn)品并消費(fèi)掉。然后對(duì)互斥信號(hào)量Mutex和資源信號(hào)量Full進(jìn)行V操作,釋放資源。如果緩沖區(qū)中已經(jīng)沒(méi)有可用資源
9、,就把申請(qǐng)資源的進(jìn)程添加到等待隊(duì)列的隊(duì)尾。如果有一個(gè)資源被釋放,在等待隊(duì)列中的第一個(gè)進(jìn)程被喚醒并取得這個(gè)資源的使用權(quán)。 5.2、程序流程圖生產(chǎn)者線程開始資源信號(hào)量P操作互斥信號(hào)量P操作生產(chǎn)一個(gè)產(chǎn)品把產(chǎn)品送入緩沖區(qū)互斥信號(hào)量V操作資源信號(hào)量V操作等待隊(duì)列中有消費(fèi)者線程等待隊(duì)列中有消費(fèi)者線程線程自我阻塞添加到等待隊(duì)列線程自我阻塞添加到等待隊(duì)列未通過(guò)未通過(guò)通過(guò)通過(guò)喚醒對(duì)頭的消費(fèi)者線程喚醒對(duì)頭的消費(fèi)者線程生產(chǎn)者線程結(jié)束YYNN圖一 生產(chǎn)者流程結(jié)構(gòu)消費(fèi)者線程開始資源信號(hào)量P操作互斥信號(hào)量P操作從緩沖區(qū)取出一個(gè)產(chǎn)品消費(fèi)一個(gè)產(chǎn)品互斥信號(hào)量V操作資源信號(hào)量V操作等待隊(duì)列中有生產(chǎn)者線程等待隊(duì)列中有生產(chǎn)者線程線程
10、自我阻塞添加到等待隊(duì)列線程自我阻塞添加到等待隊(duì)列未通過(guò)未通過(guò)通過(guò)通過(guò)喚醒對(duì)頭的生產(chǎn)者線程喚醒對(duì)頭的生產(chǎn)者線程消費(fèi)者線程結(jié)束YYNN圖二 消費(fèi)者流程結(jié)構(gòu)5.3、程序自定義函數(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ù)是用
11、來(lái)設(shè)置生產(chǎn)者的個(gè)數(shù)和他們的名字。4、void setconsumer(void);這個(gè)函數(shù)是用來(lái)設(shè)置消費(fèi)者的個(gè)數(shù)和他們的名字。5、void activepthread(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之間。5.4、系統(tǒng)函數(shù)調(diào)
12、用線程Linux系統(tǒng)下的多線程遵循POSIX線程接口,稱為pthread。編寫Linux下的多線程程序,需要使用頭文件pthread.h,連接時(shí)需要使用庫(kù)libpthread.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
13、*), void *_arg);第一個(gè)參數(shù)為指向線程標(biāo)識(shí)符的指針,第二個(gè)參數(shù)用來(lái)設(shè)置線程屬性,第三個(gè)參數(shù)是線程運(yùn)行函數(shù)的起始地址,最后一個(gè)參數(shù)是運(yùn)行函數(shù)的參數(shù)。第二個(gè)參數(shù)我們也設(shè)為空指針,這樣將生成默認(rèn)屬性的線程。當(dāng)創(chuàng)建線程成功時(shí),函數(shù)返回0,若不為0則說(shuō)明創(chuàng)建線程失敗,常見的錯(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 pthrea
14、d_join _P (pthread_t _th, void *_thread_return);第一個(gè)參數(shù)為被等待的線程標(biāo)識(shí)符,第二個(gè)參數(shù)為一個(gè)用戶定義的指針,它可以用來(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ù)的
15、返回代碼,只要pthread_join中的第二個(gè)參數(shù)thread_return不是NULL,這個(gè)值將被傳遞給 thread_return。最后要說(shuō)明的是,一個(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()起同樣的作用,它是函
16、數(shù)sem_wait()的非阻塞版本。它們都在頭文件 /usr/include/semaphore.h中定義。信號(hào)量的數(shù)據(jù)類型為結(jié)構(gòu)sem_t,它本質(zhì)上是一個(gè)長(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è)信
17、號(hào)量上時(shí),調(diào)用這個(gè)函數(shù)會(huì)使其中的一個(gè)線程不在阻塞,選擇機(jī)制同樣是由線程的調(diào)度策略決定的。函數(shù)sem_wait( sem_t *sem )被用來(lái)阻塞當(dāng)前線程直到信號(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。六源程序清單6.1、源程序#include <windows.h> #include <stdio.h> #include <stdli
18、b.h> #include <time.h> typedef HANDLE Semaphore; / 信號(hào)量的Windows原型 #define P(S) WaitForSingleObject(S,INFINITE) / 定義Windows下的P操作 #define V(S) ReleaseSemaphore(S,1,NULL) / 定義Windows下的V操作 #define rate 1000 #define CONSUMER_NUM 2 /* 消費(fèi)者個(gè)數(shù) */ #define PRODUCER_NUM 3 /* 生產(chǎn)者個(gè)數(shù) */ #define BUFFER_NUM
19、20 /* 緩沖區(qū)個(gè)數(shù) */ char *thing8 = "雞腿堡", "薯?xiàng)l", "可樂(lè)", "三明治", "面包", "小籠包", "火腿","饅頭" /生產(chǎn)和消費(fèi)的產(chǎn)品名稱 struct Buffer int productBUFFER_NUM; / 緩沖區(qū) int start,end; / 兩個(gè)指針相當(dāng)于教材中的 in out 指針 g_buf; Semaphore Empty,Full,Mutex; /分別相當(dāng)于Empty,
20、 Full, Mutex三個(gè)信號(hào)量 /* 消費(fèi)者線程*/ DWORD WINAPI Consumer(LPVOID para) / i表示第i個(gè)消費(fèi)者 int i = *(int *)para; /利用para傳入當(dāng)前消費(fèi)者的編號(hào) int ptr; / 待消費(fèi)的內(nèi)容的指針 printf("消費(fèi)者%1d: 需要資源n", i); int j=0; while (j+<4) / 等待產(chǎn)品 P(Full); / 有產(chǎn)品,先鎖住緩沖區(qū) P(Mutex); / 記錄消費(fèi)的物品 ptr=g_buf.start; / 再移動(dòng)緩沖區(qū)指針 g_buf.start= (g_buf.sta
21、rt+1)%BUFFER_NUM; /讓其他消費(fèi)者或生產(chǎn)者使用 printf(" 消費(fèi)者%01d: 我需要buf%d=%sn",i, ptr, thingg_ductptr); /消費(fèi)完畢,并釋放一個(gè)緩沖 printf(" 消費(fèi)者%01d: 我消費(fèi)完畢%sn", i,thingg_ductptr); V(Mutex); V(Empty); Sleep(rate*rand()%10+110); return 0; /* 生產(chǎn)者線程*/ DWORD WINAPI Producer(LPVOID para) int i = *(in
22、t *)para - CONSUMER_NUM; int ptr; int data; /產(chǎn)品 int j=0; while(j+<4) data=rand()%8; printf("生產(chǎn)者%01d: 生產(chǎn)出: %s!n",i,thingdata); /等待存放空間 P(Empty); /有地方,先鎖住緩沖區(qū) P(Mutex); /記錄消費(fèi)的物品 ptr=g_buf.end; /再移動(dòng)緩沖區(qū)指針 g_buf.end =(g_buf.end+1)%BUFFER_NUM; printf("生產(chǎn)者%01d: 放到緩沖區(qū) buf%d=%sn",i,ptr,
23、thingdata); g_ductptr=data; /放好了完畢,釋放一個(gè)產(chǎn)品 /讓其他消費(fèi)者或生產(chǎn)者使用 V(Mutex); V(Full); Sleep(rate/2*rand()%10+110); return 0; int main(int argc,char *argv) /線程技術(shù),前面為消費(fèi)者線程,后面為生產(chǎn)者線程 HANDLE hThreadCONSUMER_NUM+PRODUCER_NUM; / 線程計(jì)數(shù) srand(time(NULL); rand(); DWORD tid; int i=0; /初始化信號(hào)量 Mutex=CreateSemaphore(N
24、ULL,1,1,"MutexOfConsumerAndProducer"); Empty=CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, "BufferSemaphone"); Full=CreateSemaphore(NULL,0,BUFFER_NUM,"ProductSemaphone"); if(!Empty|!Full|!Mutex) printf("Create Semaphone Error!n"); return -1; int totalThreads=C
25、ONSUMER_NUM+PRODUCER_NUM; /開啟消費(fèi)者線程 printf("先請(qǐng)消費(fèi)者上席!n"); for(i=0;i<CONSUMER_NUM; i+) hThreadi=CreateThread(NULL, 0, Consumer, &i,0,&tid); if(hThreadi)WaitForSingleObject(hThreadi,10); printf("生產(chǎn)者就位!n"); for(;i<totalThreads;i+) hThreadi=CreateThread(NULL,0,Producer,&i,0,&tid); if(hThreadi)WaitForSingleObject(hThreadi,10); /生產(chǎn)者和消費(fèi)者的執(zhí)行 WaitForMultipleObjects(totalThreads,hThread,TRUE,INFINITE); return 0; 6.2、編譯及運(yùn)行結(jié)果在程序中設(shè)置了兩個(gè)消費(fèi)者,三個(gè)生產(chǎn)者,為便于描述出生產(chǎn)-消費(fèi)的
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年焦炭采購(gòu)與銷售合同
- 大班秋天語(yǔ)言教案分析
- 股權(quán)轉(zhuǎn)讓協(xié)議書模板集錦8篇
- 保健工作計(jì)劃模板集合八篇
- 初一年級(jí)上冊(cè)語(yǔ)文教學(xué)計(jì)劃
- 大學(xué)生畢業(yè)自我鑒定(15篇)
- 小學(xué)體育個(gè)人工作計(jì)劃
- 酒店前臺(tái)的實(shí)習(xí)報(bào)告范文十篇
- 做教師的心得體會(huì)
- 業(yè)務(wù)員半年工作總結(jié)15篇
- GB∕T 38053-2019 裝配式支吊架通用技術(shù)要求
- 初中數(shù)學(xué)一題多變一題多解(四)
- 橋梁工程各工序的工期保證措施
- 小學(xué)道德與法治教學(xué)論文(五篇)
- [通知╱申請(qǐng)]陜西省衛(wèi)生專業(yè)技術(shù)人員到農(nóng)村基層支醫(yī)工作鑒定表
- 臺(tái)式電腦采購(gòu)評(píng)分標(biāo)準(zhǔn)
- 某冶金機(jī)械修造廠總降壓變電所及配電系統(tǒng)設(shè)計(jì)
- 泰安市生育保險(xiǎn)待遇申報(bào)表
- 5WHY分析報(bào)告模板-改進(jìn)版
- 移動(dòng)式虹吸管防汛搶險(xiǎn)設(shè)備(移動(dòng)式虹吸搶險(xiǎn)泵)
- 魯教版選修《將軍族》原文閱讀
評(píng)論
0/150
提交評(píng)論