操作系統(tǒng)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題_第1頁(yè)
操作系統(tǒng)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題_第2頁(yè)
操作系統(tǒng)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題_第3頁(yè)
操作系統(tǒng)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題_第4頁(yè)
操作系統(tǒng)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩9頁(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)介

1、操作系統(tǒng)綜合設(shè)計(jì)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題目 錄第一部分:實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者問(wèn)題一、題目21、課程設(shè)計(jì)目的22、課程設(shè)計(jì)要求2二、設(shè)計(jì)內(nèi)容2三、開(kāi)發(fā)環(huán)境3四、分析設(shè)計(jì)31、設(shè)計(jì)原理32、涉及的數(shù)據(jù)結(jié)構(gòu)53、流程圖6五、運(yùn)行示例及結(jié)果分析81、運(yùn)行示例82、運(yùn)行結(jié)果分析:9六、個(gè)人體會(huì)9七、附錄(源程序)10第一部分:實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者問(wèn)題一、題目:實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者問(wèn)題此問(wèn)題是經(jīng)典的進(jìn)程同步互斥問(wèn)題,問(wèn)題描述參見(jiàn)教材第36頁(yè)和第46頁(yè),要求編程實(shí)現(xiàn),生產(chǎn)者放入產(chǎn)品的和消費(fèi)者取走產(chǎn)品的速度可以調(diào)節(jié)。1、課程設(shè)計(jì)目的:在我們所學(xué)的操作系統(tǒng)這門(mén)課程中,關(guān)于經(jīng)典進(jìn)程的同步問(wèn)題進(jìn)行了一定的描述和探討,介紹了幾

2、個(gè)經(jīng)典的算法,需要我們?cè)趯?shí)踐中學(xué)會(huì)熟練運(yùn)用。在生產(chǎn)者與消費(fèi)者問(wèn)題中,需要我們了解進(jìn)程同步的概念,理解信號(hào)量機(jī)制的原理,掌握運(yùn)用信號(hào)量解決進(jìn)程同步問(wèn)題的方法,進(jìn)而學(xué)會(huì)運(yùn)用進(jìn)程的同步與互斥解決生產(chǎn)者與消費(fèi)者的沖突問(wèn)題。2、課程設(shè)計(jì)要求:生產(chǎn)者與消費(fèi)者問(wèn)題可以算作是經(jīng)典進(jìn)程同步問(wèn)題的典型代表。該課程設(shè)計(jì)要求運(yùn)用基于單緩沖區(qū)和多緩沖區(qū)的生產(chǎn)者與消費(fèi)者問(wèn)題的多種實(shí)現(xiàn)機(jī)制,其中利用了數(shù)據(jù)結(jié)構(gòu)中的循環(huán)隊(duì)列和堆棧來(lái)模擬實(shí)現(xiàn)是一種比較容易實(shí)現(xiàn)的方法。這種思想能夠幫助我們更好的理解所學(xué)內(nèi)容,并加以鍛煉我們的動(dòng)手實(shí)踐能力,實(shí)現(xiàn)它內(nèi)在具有的超強(qiáng)的參考價(jià)值和實(shí)踐意義。該課程設(shè)計(jì)通過(guò)了解進(jìn)程間的兩種制約關(guān)系,從而理解信號(hào)

3、量機(jī)制;通過(guò)對(duì)實(shí)例的分析和討論,理解信號(hào)量機(jī)制實(shí)現(xiàn)進(jìn)程的同步及互斥的方法;通過(guò)對(duì)經(jīng)典進(jìn)程同步問(wèn)題的剖析,初步掌握運(yùn)用信號(hào)量解決進(jìn)程同步問(wèn)題的方法。二、設(shè)計(jì)內(nèi)容在同一個(gè)進(jìn)程地址空間內(nèi)執(zhí)行的兩個(gè)線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個(gè)空緩沖區(qū)中供消費(fèi)者線程消費(fèi)。消費(fèi)者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當(dāng)生產(chǎn)者線程生產(chǎn)物品時(shí),如果沒(méi)有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費(fèi)者線程釋放出一個(gè)空緩沖區(qū)。當(dāng)消費(fèi)者線程消費(fèi)物品時(shí),如果沒(méi)有滿的緩沖區(qū),那么消費(fèi)者線程將被阻塞,直到新的物品被生產(chǎn)出來(lái),我的具體做法也是如此,建立緩沖區(qū),生產(chǎn)者生產(chǎn)的產(chǎn)品放入,消費(fèi)者從中取產(chǎn)品,如果沒(méi)有產(chǎn)品,則等待。三、

4、開(kāi)發(fā)環(huán)境此程序的設(shè)計(jì)在Windows XP操作系統(tǒng)下,基于Microsoft Visual C+6.00環(huán)境下的一個(gè)關(guān)于實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者問(wèn)題的程序。用C語(yǔ)言實(shí)現(xiàn)編程。四、分析設(shè)計(jì)1、設(shè)計(jì)原理進(jìn)程同步是指幾個(gè)進(jìn)程相互合作,一個(gè)進(jìn)程到達(dá)某個(gè)點(diǎn)后,除非另一個(gè)進(jìn)程已經(jīng)完成某些操作,否則就不得不停下來(lái),等待這些操作的結(jié)束,這就是進(jìn)程同步的概念。生產(chǎn)者-消費(fèi)者問(wèn)題是一個(gè)經(jīng)典的進(jìn)程同步問(wèn)題,該問(wèn)題最早由Dijkstra提出,用以演示他提出的信號(hào)量機(jī)制。本作業(yè)要求設(shè)計(jì)在同一個(gè)進(jìn)程地址空間內(nèi)執(zhí)行的兩個(gè)線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個(gè)空緩沖區(qū)中供消費(fèi)者線程消費(fèi)。消費(fèi)者線程從緩沖區(qū)中獲得物品,然后釋

5、放緩沖區(qū)。當(dāng)生產(chǎn)者線程生產(chǎn)物品時(shí),如果沒(méi)有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費(fèi)者線程釋放出一個(gè)空緩沖區(qū)。當(dāng)消費(fèi)者線程消費(fèi)物品時(shí),如果沒(méi)有滿的緩沖區(qū),那么消費(fèi)者線程將被阻塞,直到新的物品被生產(chǎn)出來(lái)。生產(chǎn)者消費(fèi)者問(wèn)題是一種同步問(wèn)題的抽象描述。計(jì)算機(jī)系統(tǒng)中的每個(gè)進(jìn)程都可以消費(fèi)或生產(chǎn)某類(lèi)資源,當(dāng)系統(tǒng)中某一進(jìn)程使用某一資源時(shí),可以看作是消耗,且該進(jìn)程稱(chēng)為消費(fèi)者。而當(dāng)某個(gè)進(jìn)程釋放資源時(shí),則它就相當(dāng)一個(gè)生產(chǎn)者。 通過(guò)一個(gè)有界緩沖區(qū)把生產(chǎn)者和消費(fèi)者聯(lián)系起來(lái)。假定生產(chǎn)者和消費(fèi)者是相互等效的,只要緩沖區(qū)未滿,生產(chǎn)者就可以將產(chǎn)品送入緩沖區(qū),類(lèi)似地,只要緩沖區(qū)未空,消費(fèi)者就可以從緩沖區(qū)中去走物品并消費(fèi)它。生產(chǎn)者和

6、消費(fèi)者的同步關(guān)系將禁止生產(chǎn)者向滿的緩沖區(qū)輸送產(chǎn)品,也禁止消費(fèi)者從空的緩沖區(qū)中提取物品。 在生產(chǎn)者消費(fèi)者問(wèn)題中,信號(hào)燈具有兩種功能。首先,它是跟蹤資源的生產(chǎn)和消費(fèi)的計(jì)數(shù)器;其次,它是協(xié)調(diào)資源的生產(chǎn)者和消費(fèi)者之間的同步器。消費(fèi)者通過(guò)再一指派給它的信號(hào)燈上做P操作來(lái)表示消耗資源,而生產(chǎn)者通過(guò)在同一信號(hào)燈上做V操作來(lái)表示生產(chǎn)資源。再這種信號(hào)燈的實(shí)施中,計(jì)數(shù)在每次P操作后減1,而在每次V操作中加1。個(gè)這一計(jì)數(shù)器的初始值是可利用的資源數(shù)目。當(dāng)資源是不可利用時(shí),將申請(qǐng)資源的進(jìn)程放置在等待隊(duì)列中。如果有一個(gè)資源釋放,在等待隊(duì)列中的第一個(gè)進(jìn)程被喚醒并得到資源的控制權(quán)。 為解決這一類(lèi)生產(chǎn)者消費(fèi)者問(wèn)題,設(shè)置了兩個(gè)同

7、步信號(hào)燈,一個(gè)說(shuō)明空緩沖區(qū)的數(shù)目,用empty表示,其初值為有界緩沖區(qū)的大小n,另一個(gè)說(shuō)明緩沖區(qū)的數(shù)目,用full表示,其初制值為0。由于有界緩沖區(qū)是一個(gè)零界資源,必須互斥使用,所以另外還需設(shè)置一個(gè)互斥信號(hào)燈mutex,起初值為1。 假定在生產(chǎn)者和消費(fèi)者之間的公用緩沖區(qū)中,具有n個(gè)緩沖區(qū),這時(shí)可以利用互斥信號(hào)量mutex實(shí)現(xiàn)諸進(jìn)程對(duì)緩沖池的互斥使用;利用信號(hào)量empty和full分別表示緩沖池中空緩沖區(qū)和滿緩沖區(qū)的數(shù)量。又假定這些生產(chǎn)者和消費(fèi)者互相等效果,只要緩沖池未滿,生產(chǎn)者便可以將消息送入緩沖池;只要緩沖池未空,消費(fèi)者便可以從緩沖池中取走一個(gè)消息。在生產(chǎn)者-消費(fèi)者問(wèn)題中應(yīng)注意:首先,在每個(gè)

8、程序中用于互斥的wait(mutex)和signal(mutex)必須成對(duì)出現(xiàn);其次,對(duì)資源信號(hào)量empty和full的wait和signal操作,同樣需要成對(duì)地出現(xiàn),但它們分別處于不同的程序中。生產(chǎn)者與消費(fèi)者進(jìn)程共享一個(gè)大小固定的緩沖區(qū)。其中,一個(gè)或多個(gè)生產(chǎn)者生產(chǎn)數(shù)據(jù),并將生產(chǎn)的數(shù)據(jù)存入緩沖區(qū),并有一個(gè)或多個(gè)消費(fèi)者從緩沖區(qū)中取數(shù)據(jù)。假設(shè)緩沖區(qū)的大小為n(存儲(chǔ)單元的個(gè)數(shù)),它可以被生產(chǎn)者和消費(fèi)者循環(huán)使用。分別設(shè)置兩個(gè)指針in和out,指向生產(chǎn)者將存放數(shù)據(jù)的存儲(chǔ)單元和消費(fèi)者將取出數(shù)據(jù)的存儲(chǔ)單元,如圖,指針in和out初始化指向緩沖區(qū)的第一個(gè)存儲(chǔ)單元。生產(chǎn)者從第一個(gè)存儲(chǔ)單元開(kāi)始存放數(shù)據(jù),一次存放一

9、條數(shù)據(jù)一條數(shù)據(jù)且in指針向后移一個(gè)位置,當(dāng)in 指針指向第n個(gè)存儲(chǔ)單元,下一次將指向第一個(gè)存儲(chǔ)單元,如此循環(huán)反復(fù)使用緩沖區(qū)。消費(fèi)者從緩沖區(qū)中逐條取走數(shù)據(jù),一次取一條數(shù)據(jù),相應(yīng)的存儲(chǔ)單元變?yōu)椤翱铡?,可以被生產(chǎn)者再次使用。每次取走一條數(shù)據(jù),out指針向后移一個(gè)存儲(chǔ)單元位置。試想,如果不控制生產(chǎn)者與消費(fèi)者,將會(huì)產(chǎn)生什么結(jié)果? 1 2 3 4 5 6 7 8 n In out 1 2 3 4 5 6 7 8 n In out 其中,in表示存數(shù)據(jù)位置,out表示取數(shù)據(jù)位置: :被占用單元 :空存儲(chǔ)單元圖:生產(chǎn)者/消費(fèi)者循環(huán)使用緩沖區(qū)首先,生產(chǎn)者和消費(fèi)者可能同時(shí)進(jìn)入緩沖區(qū),甚至可能同時(shí)讀/寫(xiě)一個(gè)存儲(chǔ)單元

10、,將導(dǎo)致執(zhí)行結(jié)果不確定。這顯然是不允許的。所以,必須使生產(chǎn)者和消費(fèi)者互斥進(jìn)入緩沖區(qū)。即某時(shí)刻只允許一個(gè)實(shí)體(生產(chǎn)者或消費(fèi)者)訪問(wèn)緩沖區(qū),生產(chǎn)者互斥消費(fèi)者和其他任何生產(chǎn)者。其次,生產(chǎn)者不能向滿的緩沖區(qū)寫(xiě)數(shù)據(jù),消費(fèi)者也不能在空緩沖區(qū)中取數(shù)據(jù),即生產(chǎn)者與消費(fèi)者必須同步。當(dāng)生產(chǎn)者產(chǎn)生出數(shù)據(jù),需要將其存入緩沖區(qū)之前,首先檢查緩沖區(qū)中是否有“空”存儲(chǔ)單元,若緩沖區(qū)存儲(chǔ)單元全部用完,則生產(chǎn)者必須阻塞等待,直到消費(fèi)者取走一個(gè)存儲(chǔ)單元的數(shù)據(jù),喚醒它。若緩沖區(qū)內(nèi)有“空”存儲(chǔ)單元,生產(chǎn)者需要判斷此時(shí)是否有別的生產(chǎn)者或消費(fèi)者正在使用緩沖區(qū),若是有,則阻塞等待,否則,獲得緩沖區(qū)的使用權(quán),將數(shù)據(jù)存入緩沖區(qū),釋放緩沖區(qū)的使

11、用權(quán)。消費(fèi)者取數(shù)據(jù)之前,首先檢查緩沖區(qū)中是否存在裝有數(shù)據(jù)的存儲(chǔ)單元,若緩沖區(qū)為“空”,則阻塞等待,否則,判斷緩沖區(qū)是否正在被使用,若正被使用,若正被使用,則阻塞等待,否則,獲得緩沖區(qū)的使用權(quán),進(jìn)入緩沖區(qū)取數(shù)據(jù),釋放緩沖區(qū)的使用權(quán)。其執(zhí)行流程如圖所示,偽代碼如圖所示。2、涉及的數(shù)據(jù)結(jié)構(gòu)用資源向量Available。這是一個(gè)含有m個(gè)元素的數(shù)組,其中的每一個(gè)元素代表一類(lèi)可利用的資源數(shù)目,其初始值是系統(tǒng)中所配置的該類(lèi)全部可用資源的數(shù)目,其數(shù)值隨該類(lèi)資源的分配和回收而動(dòng)態(tài)地改變。如果Availablej=K,則表示系統(tǒng)中縣有RJ類(lèi)資源K個(gè)。需求矩陣MAX。這是一個(gè)N*M的矩陣,它定義了系統(tǒng)中N個(gè)進(jìn)程中的

12、每一個(gè)進(jìn)程對(duì)M類(lèi)資源的最大需求。如果MAXi,j=K,則表示進(jìn)程I需要RJ類(lèi)資源的最大數(shù)目為K。矩陣Allocation。這也是一個(gè)N*M的矩陣,它定義了系統(tǒng)中每一類(lèi)資源當(dāng)前已分配給每一進(jìn)程的資源數(shù)。如果Allocationi,j=K,則表示進(jìn)程i當(dāng)前已分得RJ類(lèi)資源的數(shù)目為K。矩陣Need。這也是一個(gè)N*M的矩陣,用以表示每一個(gè)進(jìn)程尚需的各類(lèi)資源數(shù)。如果Needi,j=K,則表示進(jìn)程I還需要RJ類(lèi)資源K個(gè),方能完成其任務(wù)。 上述三個(gè)矩陣間存在下述關(guān)系: Needi,j=MAXi,j-Allocationi,j3、流程圖等待使用權(quán),阻塞被喚醒等待資源,阻塞數(shù)據(jù)單元加1,喚醒一個(gè)消費(fèi)者歸還使用權(quán)

13、存入一條數(shù)據(jù)生產(chǎn)一條數(shù)據(jù)是否可用存儲(chǔ)單元 無(wú) 有是否可用 否被喚醒是否有數(shù)據(jù)單元等待資源,阻塞 有被喚醒是否可用 否消費(fèi)數(shù)據(jù)空單元加1,喚醒一個(gè)生產(chǎn)者歸還使用權(quán)被喚醒取走一條數(shù)據(jù)等待使用權(quán),阻塞 是五、運(yùn)行示例及結(jié)果分析1、運(yùn)行示例:2、運(yùn)行結(jié)果分析:此程序可自動(dòng)輸入生產(chǎn)者、消費(fèi)者數(shù)目等條件,但程序執(zhí)行過(guò)程中也進(jìn)入了一種無(wú)限循環(huán)狀態(tài),若要得到較好的結(jié)果和界面需要加強(qiáng)編程練習(xí)。六、個(gè)人體會(huì)經(jīng)過(guò)快一個(gè)月的時(shí)間來(lái)弄這個(gè)大型作業(yè)。我當(dāng)時(shí)真的有點(diǎn)力不從心。后來(lái)老師只要我們實(shí)現(xiàn)OS里面的一部分功能-進(jìn)程的控制和管理。就是比較有名的那兩個(gè)進(jìn)程算法。有于當(dāng)時(shí)在實(shí)驗(yàn)室就對(duì)進(jìn)程之間的運(yùn)轉(zhuǎn)有了一個(gè)全面的了解,雖然好

14、多的細(xì)節(jié)部分還不是太了解,但是對(duì)一個(gè)進(jìn)程的流向和執(zhí)行過(guò)程還是有個(gè)大概的認(rèn)識(shí),所以這個(gè)大型作業(yè)做起來(lái)也不是那么的簡(jiǎn)單。那些東西的詳細(xì)說(shuō)明在我們的教材上是沒(méi)有的。后來(lái),我就在網(wǎng)上和圖書(shū)館大量的找資料。先對(duì)那些算法有一個(gè)大致全面的了解。經(jīng)過(guò)兩個(gè)多星期的查資料。我就開(kāi)始對(duì)那兩個(gè)算法的代碼進(jìn)行完善和修改,以達(dá)到我的要求。有經(jīng)過(guò)了一個(gè)多星期的調(diào)試和運(yùn)行終于達(dá)到了我的要求了。并把結(jié)果截取如下。在生產(chǎn)者與消費(fèi)者問(wèn)題的算法編寫(xiě)程序的時(shí)候要盡可能用全所學(xué)到的函數(shù),因?yàn)檫@是檢測(cè)我們用C語(yǔ)言進(jìn)行程序設(shè)計(jì)的能力的重要方式。在編寫(xiě)程序的時(shí)候我們不可能一次就成功,往往一個(gè)圖形要修改甚至是十幾次數(shù)據(jù)才能得到預(yù)期的結(jié)果。因此在

15、編寫(xiě)程序的時(shí)候一定不能急躁,要耐心地檢測(cè)輸入的數(shù)據(jù)和輸出的結(jié)果,在沒(méi)達(dá)到預(yù)期目的的情況下,要及時(shí)修改數(shù)據(jù)進(jìn)行下一次的檢測(cè),只有這樣才能成功地用C語(yǔ)言編寫(xiě)出需要的程序。 編寫(xiě)程序是一個(gè)長(zhǎng)期的過(guò)程,因此不能急躁,要坐的住。由于對(duì)C語(yǔ)言知識(shí)已經(jīng)有些遺忘,所以我找出了以前的筆記,花了半天的時(shí)間去回憶和理解。對(duì)操作系統(tǒng)有關(guān)消費(fèi)者-生產(chǎn)者問(wèn)題的含義也已經(jīng)有點(diǎn)模糊,我花了一天的時(shí)間看教材,還到圖書(shū)館借閱了相關(guān)的資料,才開(kāi)始編程。剛開(kāi)始對(duì)如何動(dòng)態(tài)實(shí)現(xiàn)消費(fèi)者-生產(chǎn)者問(wèn)題一籌莫展,于是和一些同學(xué)就這個(gè)問(wèn)題討論過(guò),但是沒(méi)什么好的效果。編寫(xiě)程序有的時(shí)候需要的就是靈感,因此當(dāng)有靈感的時(shí)候就要開(kāi)始做,而不能等,必須在靈感

16、未消失前付諸行動(dòng),所以才有了凌晨?jī)牲c(diǎn)才最后做完大型作業(yè)。雖然很累,但是覺(jué)得值得。歷經(jīng)快一個(gè)月的時(shí)間讓我馬馬乎乎的完成了它,從中讓我得到了好多的東西,首先,這個(gè)過(guò)程鍛煉了我的意志,還讓我對(duì)進(jìn)程的控制和編寫(xiě)過(guò)程有了一個(gè)更深層次的認(rèn)識(shí)和理解。其次,我現(xiàn)在對(duì)Windows操作系統(tǒng)執(zhí)行流程有了一個(gè)透明的認(rèn)識(shí),同時(shí)也讓我對(duì)它更有親切感??傊@次作業(yè)讓我受益匪淺!七、附錄(源程序) #include #include #include typedef HANDLE Semaphore; /信號(hào)量的Windows原型 #define P(S) WaitForSingleObject(S, INFINITE)

17、 /定義Windows下的P操作 #define V(S) ReleaseSemaphore(S, 1, NULL)/定義Windows下的V操作 #define rate 1000 #define CONSUMER_NUM 4 /* 消費(fèi)者個(gè)數(shù) */ #define PRODUCER_NUM 4 /* 生產(chǎn)者個(gè)數(shù) */ #define BUFFER_NUM 4 /* 緩沖區(qū)個(gè)數(shù) */ char *thing10=s1, s2, s3, s4,; struct Buffer int productBUFFER_NUM; / 緩沖區(qū) int start, end; / 兩個(gè)指針 g_buf; S

18、emaphore g_semBuffer, g_semProduct, g_mutex; /消費(fèi)者線程 DWORD WINAPI Consumer(LPVOID para) /i表示第i個(gè)消費(fèi)者 Int i = *(int *)para; int ptr; /待消費(fèi)的內(nèi)容的指針 printf(小白兔-%03d:葉子n, i); Sleep(1800); while (1) printf(小白兔-%03d:我餓了.!n,i); /等待產(chǎn)品 P(g_semProduct); /有產(chǎn)品,先鎖住緩沖區(qū)g_buf P(g_mutex); /記錄消費(fèi)的物品 ptr=g_buf.start; /再移動(dòng)緩沖區(qū)

19、指針 g_buf.start= (g_buf.start+1)%BUFFER_NUM; /讓其他消費(fèi)者或生產(chǎn)者使用g_buf V(g_mutex); printf(小白兔-%03d:我需要buf%d = %sn, i, ptr, thingg_ductptr); Sleep(rate*rand()%10+1800); /消費(fèi)完畢,并釋放一個(gè)緩沖 printf(小白兔-%03d:吃綠葉buf%d = %sn,i, ptr, thingg_ductptr); V(g_semBuffer); Return 0; /生產(chǎn)者線程 DWORD WINAPI Producer(L

20、PVOID para) int i=*(int*)para-CONSUMER_NUM; int ptr; int data; /產(chǎn)品 printf(小草-%03d:小白兔快來(lái)找我!n, i); Sleep(1800); while (1) printf(小草-%03d:我愛(ài)陽(yáng)光n, i); Sleep(rate*rand()%10+1800); data = rand()%10; printf(小草-%03d:我要長(zhǎng)大!data = %s!n, i, thingdata); /等待存放空間 P(g_semBuffer); /有地方,先鎖住緩沖區(qū)g_buf P(g_mutex); /記錄消費(fèi)的物

21、品 ptr = g_buf.end; /再移動(dòng)緩沖區(qū)指針 g_buf.end = (g_buf.end+1)%BUFFER_NUM; /讓其他消費(fèi)者或生產(chǎn)者使用 g_buf V(g_mutex); printf(小草-%03d:長(zhǎng)大了!buf%d = %sn, i, ptr, thingdata); g_ductptr = data; Sleep(rate/2*rand()%10+1800); /放好了完畢,釋放一個(gè)產(chǎn)品 printf(小草-%03d: buf%d=%s 小白兔快來(lái)!n,i, ptr,thingg_ductptr); V(g_semProduct);

22、 return 0; int main(int argc, char *argv) /線程技術(shù),前面為消費(fèi)者線程,后面為生產(chǎn)者線程 HANDLE hThreadCONSUMER_NUM+PRODUCER_NUM; /線程計(jì)數(shù) /srand(time(); DWORD tid; int i=0; /初始化信號(hào)量 g_mutex=CreateSemaphore(NULL,BUFFER_NUM,BUFFER_NUM,mutexOfConsumerAndProducer); g_semBuffer=CreateSemaphore(NULL,BUFFER_NUM,BUFFER_NUM,BufferSemaphone); g_semProduct= CreateSemaphore(NULL, 0, BUFFER_NUM, Prod

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論