生產者消費者完整代碼_第1頁
生產者消費者完整代碼_第2頁
生產者消費者完整代碼_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、四、實現(xiàn)代碼#include #iiiclude const unsigned short SIZE_OFJBUFFER = 10; 緩沖區(qū)長度unsigned short ProductED = 0;產品號unsigned short ConsumeDD = 0;將被消耗的產品號unsigned short m = 0;產品進緩沖區(qū)時的緩沖區(qū)下標unsigned short out = 0;產品出緩沖區(qū)時的緩沖區(qū)下標mt g_bufferSIZE_OF_BUFFER;/緩沖區(qū)是個循環(huán)隊列bool g_contiiiue = tme;/控制程序結束HANDLE gJiMutex;用于線程間的互

2、斥HANDLE g_iiFullSeniaphore;當緩沖區(qū)滿時迫使生產者等待HANDLE g_liEmptySemaphoie;當緩沖區(qū)空時迫使消費者等待DWORD WINAPI Producer(LPVOID); 生產者線程DWORD WINAPI Consumer(LPVOID); 消費者線程iiit mam()創(chuàng)建各個互斥信號g_hMutex = CreateMutex(NULL,FALSE,NULL);g_hFullSemaphoreCreateSemaphoie(NULL.SIZE.OF_BUFFER-l ,SIZE_OFJBUFFER-1 ,NULL); g_hEmptySem

3、aphoie = CreateSeniaphore(NULL,0,SIZE_OF_BUFFER-1 .NULL);調整下面的數值,可以發(fā)現(xiàn),當生產者個數多于消費者個數時,/生產速度快,生產者經常等待消費者;反之,消費者經常等待const unsigned short PRODUCERS_COUNT = 3; /生產者的個數const unsigned short CONSUMERS_COUNT = 1; 消費者的個數總的線程數constunsignedshortTHREADS_COUNTPRODUCERS COUNT+CONSUMERS COUNT;HANDLE hTlueadsPRODUCE

4、RS_COUNT; 各線程的 handleDWORD producerlDCONSUNIERSCOUNT; /生產者線程的標識符 DWORD consumerlDTHREADS.COUNT; 消費者線程的標識符創(chuàng)建生產者線程for (mt i=0;KPRODUCERS.COUNT;+i) hTliieadsi=CreateThiead(NULL,OTroducei;NULL.O,&piodiicejLlDi);if (hThieadsi=NULL) return -1;創(chuàng)建消費者線程for (i=0;iCONSUMERS_COUNT;+i) hThieadsPRODUCERS_COUNT+i=

5、CieateThiead(NULL,O.Consumer,NULL,0.&consi】meTLDiif (hThieadsi=NULL) return -1;wliile(g_continue) if(getchai() 按回車后終止程序運行g_contmue = false;return 0;生產一個產品。簡單模擬了一下,僅輸出新產品的ID號 void Produce()std:cerr Producing H -H-ProductID H ”; std:cerr Succeed1 std:endl;把新生產的產品放入緩沖區(qū) void Append()std:cerr Appending a

6、 product ”; g_bufferin = ProductID: m = (in+l)%SIZE_OF_EUFFER; std:cerr Succeed1* std:endl;輸出緩沖區(qū)當前的狀態(tài)for (mt i=0;iSIZE.OF_BUFFER汁+i) std:cout1*: H g_bufferi; if(i=in) std:cout M -生產”; if(i=out) std:cout 11 消費”; std:cout std:endl;從緩沖區(qū)中取出一個產品void Take()std:cerr ”Taking a product ”; ConsumelD = g_bufif

7、erout;out = (out+1 )%SIZE_OF_BUFFER; std:cerr Succeed* std:endl;輸出緩沖區(qū)當前的狀態(tài)for (mt i=0;iSIZE.OF_BUFFER;+i) std:cout1n: H g_bufferi; if(i=in) std:cout H -生產”; if(i=out) std:cout M 消費”; std:cout std:endl;消耗一個產品 void ConsumeQstd:cerr Consuming M ConsumelD ” ”; std:cerr Succeed* std:endl;生產者DWORD WINAPI

8、Producer(LPVOID IpPaia)wliile(g_continue) WaitForSmgleObject(g_hFullSemaphore.INFINITE); WaitForSmgleObject(g_liMutex.INFINITE); ProduceQ;AppendQ;Sleep(1500);ReleaseMutex(g_liMutex);ReleaseSemaphore(g_liEmptySemaphoreJ .NULL);return 0;消費者DWORD WINAPI Consuiner(LPVOID IpPara)wliile(g_continue) WaitForSmgleObject(g_hEmptvSemaphore.EFINITE); WaitForSmgleOb

溫馨提示

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

評論

0/150

提交評論