生產(chǎn)者與消費(fèi)者報告_第1頁
生產(chǎn)者與消費(fèi)者報告_第2頁
生產(chǎn)者與消費(fèi)者報告_第3頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、生產(chǎn)者與消費(fèi)者實(shí)驗(yàn)報告班別: 2006軟件技術(shù) 3 班學(xué)號: 200630481228姓名:賴永周實(shí)驗(yàn)?zāi)康模赫莆站€程創(chuàng)建和終止, 加深對線程和進(jìn)程概念的理解, 會用同步與互斥方法實(shí)現(xiàn)線程之間的 通信。實(shí)驗(yàn)內(nèi)容:點(diǎn)“創(chuàng)建線程”按鈕,創(chuàng)建三個生產(chǎn)者線程(P1, P2, P3)和兩個消費(fèi)者線程(C1,C2),生產(chǎn)者和消費(fèi)者線程共享一個長度為2KB的環(huán)型公共緩沖區(qū),生產(chǎn)者向其中投放消息,消費(fèi)者從中取走消息。 只要緩沖區(qū)未滿, 生產(chǎn)者可將消息送入緩沖區(qū); 只要緩沖區(qū)未空, 消費(fèi)者可從緩沖區(qū)取走一個消息。每個生產(chǎn)者每隔n秒(n用隨機(jī)數(shù)產(chǎn)生,1到10秒之間,間隔不固定)生產(chǎn)一個消息 加入緩沖區(qū), 并把消息產(chǎn)

2、生時間和內(nèi)容記錄在列表框中。 P1 每次生產(chǎn)的數(shù)據(jù)為 26 個大寫字 母,P2每次生產(chǎn)的數(shù)據(jù)為 26個小寫字母,P3每次生產(chǎn)的數(shù)據(jù)為10個數(shù)字。每個消費(fèi)者每隔n秒(n用隨機(jī)數(shù)產(chǎn)生,1到5秒之間,間隔不固定)從緩沖區(qū)取走一 個消息。每消費(fèi)一個消息需要將消費(fèi)時間和消息內(nèi)容記錄在列表框中。同時用一個列表框記錄實(shí)時緩沖區(qū)中的消息內(nèi)容 . 當(dāng)用戶按結(jié)束按鈕時結(jié)束 5 個線程。實(shí)驗(yàn)設(shè)計方法 :1. 實(shí)驗(yàn)同步的設(shè)計方法 :實(shí)驗(yàn)中使用 WinAPI 函數(shù)創(chuàng)建了一個互斥量 h_Mutex, 兩個信號量 bufferFullSemaphore 用以錄 滿的信號 , bufferEmptySemaphore 用以記

3、錄空的信號 .其中用到的函數(shù)方法 :h_Mutex = CreateMutex(NULL,false,NULL); bufferFullSemaphore = CreateSemaphore(NULL,BUFFER_SIZE,BUFFER_SIZE,NULL); bufferEmptySemaphore = CreateSemaphore(NULL,0,BUFFER_SIZE,NULL);同時定義了 :3 個生產(chǎn)者入口函數(shù)為 :DWORD WINAPI Producter1(LPVOID pthread)DWORD WINAPI Producter2(LPVOID pthread)DWORD

4、WINAPI Producter3(LPVOID pthread)2 個消費(fèi)者入口函數(shù) :DWORD WINAPI Consumer1(LPVOID pthread)DWORD WINAPI Consumer2(LPVOID pthread)在每個入口函數(shù)中 ,使用函數(shù) :DWORD WINAPI WaitForSingleObject(_inHANDLE hHandle,_inDWORD dwMilliseconds);BOOL WINAPI ReleaseSemaphore(_inHANDLE hSemaphore,_inLONG lReleaseCount,_outLPLONG lpPr

5、eviousCount);BOOL WINAPI ReleaseMutex(_inHANDLE hMutex);對互斥量以及相應(yīng)的信號量進(jìn)行管理,使線程能夠同步運(yùn)行 .然后在主函數(shù)中使用函數(shù) :HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParamiter,DWORD dwCreationFlags,Lpdword lpThread ); 分別為每個生產(chǎn)者和消費(fèi)者創(chuàng)建線程 . 最后 ,使

6、用函數(shù)BOOL WINAPI TerminateThread(_in_outHANDLE hThread,_inDWORD dwExitCode);結(jié)束所有線程 .2. 實(shí)驗(yàn)數(shù)據(jù)的定義 : 實(shí)驗(yàn)中定義了一個線程結(jié)構(gòu)體 ,其中封裝了 CListBox 類指針 ,即列表框的所有操作 線程結(jié)構(gòu)體定義如下 :typedef struct ThreadinfoCListBox*pList;thread,*lpthread; 實(shí)驗(yàn)中使用的緩沖區(qū)定義為循環(huán)隊列用以記錄緩沖區(qū)中的消息內(nèi)容,其定義如下const int BUFFER_SIZE =5;/緩沖區(qū)長度CString bufferBUFFER_SIZE

7、 = "0"/緩沖區(qū)循環(huán)隊列int in = 0;/用與追蹤產(chǎn)品進(jìn)緩沖區(qū)時的緩沖區(qū)數(shù)組下標(biāo)int out = 0;實(shí)驗(yàn)中的消息定義統(tǒng)一為 CString 類 .3.實(shí)驗(yàn)設(shè)計思想和設(shè)計流程本程序是基于MFC對話框結(jié)構(gòu)的應(yīng)用程序.設(shè)計思想:實(shí)驗(yàn)調(diào)用 Win API函數(shù),創(chuàng)建多線程的同步方法,把列表框封裝在新的結(jié)構(gòu)體類作為入口函數(shù) 傳遞參數(shù)的指針,用以指定不同的列表框顯示對應(yīng)不同的內(nèi)容設(shè)計流程:如圖:<<in terface>>DWORD WINAPI Producter1(LPVOID pthread)DWORD WINAPI Producter1(LP

8、VOID pthread)DWORD WINAPI Producter1(LPVOID pthread) DWORD WINAPI Co nsumer1(LPVOID pthread)DWORD WINAPI Co nsumer1(LPVOID pthread)CMFCThreadDlgthread thread1;thread thread2;HANDLE hThread1;HANDLE hThread2;HANDLE hThread3;HANDLE hThread4;HANDLE hThread5;CListBox m_ProList;CListBox m_ConList;void OnC

9、an cle()void On ClearUp()void On CreateThread()void On DestroyThread()圖1由圖1知,CMFCThfreadDlg 依賴buffer,Threadinfo和生產(chǎn)者與消費(fèi)者的5個接口函數(shù)函數(shù)說明及部分代碼:void OnCancle()退出void On ClearUp()/清空列表框以及緩沖void CMFCThreadDlg:O nCreateThread()/ 創(chuàng)建線程/ TODO: Add your con trol no tificati on han dler code hereGetDlgltem(IDC_DEST

10、ROY_THREAD)->E nableWi ndow(true);DWORD code;con trol=true;DWORD ProducterID3,ConsumerID2;thread1.pList=&m_ProList;/ 指向不同的列表框控件thread2.pList=&m_ConList;h_Mutex = CreateMutex(NULL,false,NULL);/ 創(chuàng)建互斥量/創(chuàng)建信號量bufferFullSemaphore = CreateSemaphore(NULL,BUFFER_SIZE,BUFFER_SIZE,NULL); bufferEmpty

11、Semaphore = CreateSemaphore(NULL,0,BUFFER_SIZE,NULL); if(!GetExitCodeThread(hThread1,&code)|(code!=STILL_ACTIVE) hThread1=CreateThread(NULL,0,Producter1,&thread1,0,&ProducterID0); if(!GetExitCodeThread(hThread2,&code)|(code!=STILL_ACTIVE) hThread2=CreateThread(NULL,0,Producter2,&

12、thread1,0,&ProducterID1); if(!GetExitCodeThread(hThread3,&code)|(code!=STILL_ACTIVE) hThread3=CreateThread(NULL,0,Producter3,&thread1,0,&ProducterID2); if(!GetExitCodeThread(hThread4,&code)|(code!=STILL_ACTIVE) hThread4=CreateThread(NULL,0,Consumer1,&thread2,0,&ConsumerID

13、0); if(!GetExitCodeThread(hThread5,&code)|(code!=STILL_ACTIVE) hThread5=CreateThread(NULL,0,Consumer2,&thread2,0,&ConsumerID1);void OnDestroyThread() / 銷毀線程DWORD WINAPI Producter1(LPVOID pthread)/生產(chǎn)者入口函數(shù)int t;CTime c_Time;CString s_Time;lpthread temp=(lpthread)pthread;/ 參數(shù)指針轉(zhuǎn)換CString str

14、=" P1:"while(control)t=1000*(rand()%9+1);/隨機(jī)時間 (110 秒 )c_Time=CTime:GetCurrentTime();/ 獲取當(dāng)前系統(tǒng)時間s_Time=c_Time.Format("%H:%M:%S ");/格式化時間WaitForSingleObject(bufferFullSemaphore,INFINITE);/等待信號量WaitForSingleObject(h_Mutex,INFINITE); / 等待互斥量 bufferin='Z'-rand()%26;/隨機(jī)生成 26 個大

15、寫字母temp->pList->AddString(s_Time+str+bufferin);/ 在指定列表框添加內(nèi)容m_Buffer.AddString(bufferin);/在緩沖區(qū)列表框添加內(nèi)容in=(in+1)%BUFFER_SIZE;/循環(huán)隊列指針加 1Sleep(t);/ 函數(shù)阻塞時間ReleaseMutex(h_Mutex);/釋放互斥量ReleaseSemaphore(bufferEmptySemaphore,1,NULL);/ 釋放信號量 return true;DWORD WINAPI Consumer1(LPVOID pthread)/ 消費(fèi)者入口函數(shù)int

16、t,flag=0;CTime c_Time;CString s_Time;lpthread temp=(lpthread)pthread; / 參數(shù)指針轉(zhuǎn)換CString str=" C1:"while(control)t=1000*(rand()%4+1);/隨機(jī)時間 (15 秒)c_Time=CTime:GetCurrentTime();/ 獲取當(dāng)前系統(tǒng)時間s_Time=c_Time.Format("%H:%M:%S ");/ 格式化時間WaitForSingleObject(bufferEmptySemaphore,INFINITE);/等待信號量

17、WaitForSingleObject(h_Mutex,INFINITE); /等待互斥量 temp->pList->AddString(s_Time+str+bufferout); / 相應(yīng)列表框添加內(nèi)容 /緩沖區(qū)列表框?qū)ふ蚁鄳?yīng)內(nèi)容刪去 if(flag=m_Buffer.FindString(0,(LPCTSTR)bufferout)!=CB_ERR) m_Buffer.DeleteString(flag);bufferout="0"/緩沖區(qū)內(nèi)空置空out=(out+1)%BUFFER_SIZE;/循環(huán)隊列加 1Sleep(t); / 函數(shù)阻塞時間 ReleaseMutex(h_Mutex);/釋放互斥量ReleaseSemaphore(bufferFullSemaphore,1,NULL); / 釋放信號量 return true;4. 程序運(yùn)行結(jié)果 :疑沖區(qū)狀態(tài):生產(chǎn)者狀態(tài):消費(fèi)者伏態(tài)244642059:18Pl52059ISCl:13467293532059;18P2h205916C2:SB2059:18F313467205S活C2:he2059; 24PlT205956Cl:T2059:30P32650021ndijAC2:2S5002059:36P2£21;oo21Cl g2059

溫馨提示

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

評論

0/150

提交評論