下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、生產(chǎn)者與消費(fèi)者實(shí)驗(yàn)報(bào)告班別: 2006軟件技術(shù) 3 班學(xué)號(hào): 200630481228姓名:賴永周實(shí)驗(yàn)?zāi)康模赫莆站€程創(chuàng)建和終止, 加深對(duì)線程和進(jìn)程概念的理解, 會(huì)用同步與互斥方法實(shí)現(xiàn)線程之間的 通信。實(shí)驗(yàn)內(nèi)容:點(diǎn)“創(chuàng)建線程”按鈕,創(chuàng)建三個(gè)生產(chǎn)者線程(P1, P2, P3)和兩個(gè)消費(fèi)者線程(C1,C2),生產(chǎn)者和消費(fèi)者線程共享一個(gè)長(zhǎng)度為2KB的環(huán)型公共緩沖區(qū),生產(chǎn)者向其中投放消息,消費(fèi)者從中取走消息。 只要緩沖區(qū)未滿, 生產(chǎn)者可將消息送入緩沖區(qū); 只要緩沖區(qū)未空, 消費(fèi)者可從緩沖區(qū)取走一個(gè)消息。每個(gè)生產(chǎn)者每隔n秒(n用隨機(jī)數(shù)產(chǎn)生,1到10秒之間,間隔不固定)生產(chǎn)一個(gè)消息 加入緩沖區(qū), 并把消息產(chǎn)
2、生時(shí)間和內(nèi)容記錄在列表框中。 P1 每次生產(chǎn)的數(shù)據(jù)為 26 個(gè)大寫(xiě)字 母,P2每次生產(chǎn)的數(shù)據(jù)為 26個(gè)小寫(xiě)字母,P3每次生產(chǎn)的數(shù)據(jù)為10個(gè)數(shù)字。每個(gè)消費(fèi)者每隔n秒(n用隨機(jī)數(shù)產(chǎn)生,1到5秒之間,間隔不固定)從緩沖區(qū)取走一 個(gè)消息。每消費(fèi)一個(gè)消息需要將消費(fèi)時(shí)間和消息內(nèi)容記錄在列表框中。同時(shí)用一個(gè)列表框記錄實(shí)時(shí)緩沖區(qū)中的消息內(nèi)容 . 當(dāng)用戶按結(jié)束按鈕時(shí)結(jié)束 5 個(gè)線程。實(shí)驗(yàn)設(shè)計(jì)方法 :1. 實(shí)驗(yàn)同步的設(shè)計(jì)方法 :實(shí)驗(yàn)中使用 WinAPI 函數(shù)創(chuàng)建了一個(gè)互斥量 h_Mutex, 兩個(gè)信號(hào)量 bufferFullSemaphore 用以錄 滿的信號(hào) , bufferEmptySemaphore 用以記
3、錄空的信號(hào) .其中用到的函數(shù)方法 :h_Mutex = CreateMutex(NULL,false,NULL); bufferFullSemaphore = CreateSemaphore(NULL,BUFFER_SIZE,BUFFER_SIZE,NULL); bufferEmptySemaphore = CreateSemaphore(NULL,0,BUFFER_SIZE,NULL);同時(shí)定義了 :3 個(gè)生產(chǎn)者入口函數(shù)為 :DWORD WINAPI Producter1(LPVOID pthread)DWORD WINAPI Producter2(LPVOID pthread)DWORD
4、WINAPI Producter3(LPVOID pthread)2 個(gè)消費(fèi)者入口函數(shù) :DWORD WINAPI Consumer1(LPVOID pthread)DWORD WINAPI Consumer2(LPVOID pthread)在每個(gè)入口函數(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);對(duì)互斥量以及相應(yīng)的信號(hào)量進(jìn)行管理,使線程能夠同步運(yùn)行 .然后在主函數(shù)中使用函數(shù) :HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParamiter,DWORD dwCreationFlags,Lpdword lpThread ); 分別為每個(gè)生產(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)中定義了一個(gè)線程結(jié)構(gòu)體 ,其中封裝了 CListBox 類(lèi)指針 ,即列表框的所有操作 線程結(jié)構(gòu)體定義如下 :typedef struct ThreadinfoCListBox*pList;thread,*lpthread; 實(shí)驗(yàn)中使用的緩沖區(qū)定義為循環(huán)隊(duì)列用以記錄緩沖區(qū)中的消息內(nèi)容,其定義如下const int BUFFER_SIZE =5;/緩沖區(qū)長(zhǎng)度CString bufferBUFFER_SIZE
7、 = "0"/緩沖區(qū)循環(huán)隊(duì)列int in = 0;/用與追蹤產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)數(shù)組下標(biāo)int out = 0;實(shí)驗(yàn)中的消息定義統(tǒng)一為 CString 類(lèi) .3.實(shí)驗(yàn)設(shè)計(jì)思想和設(shè)計(jì)流程本程序是基于MFC對(duì)話框結(jié)構(gòu)的應(yīng)用程序.設(shè)計(jì)思想:實(shí)驗(yàn)調(diào)用 Win API函數(shù),創(chuàng)建多線程的同步方法,把列表框封裝在新的結(jié)構(gòu)體類(lèi)作為入口函數(shù) 傳遞參數(shù)的指針,用以指定不同的列表框顯示對(duì)應(yīng)不同的內(nèi)容設(shè)計(jì)流程:如圖:<<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個(gè)接口函數(shù)函數(shù)說(shuō)明及部分代碼: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)建信號(hào)量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() / 銷(xiāo)毀線程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ī)時(shí)間 (110 秒 )c_Time=CTime:GetCurrentTime();/ 獲取當(dāng)前系統(tǒng)時(shí)間s_Time=c_Time.Format("%H:%M:%S ");/格式化時(shí)間WaitForSingleObject(bufferFullSemaphore,INFINITE);/等待信號(hào)量WaitForSingleObject(h_Mutex,INFINITE); / 等待互斥量 bufferin='Z'-rand()%26;/隨機(jī)生成 26 個(gè)大
15、寫(xiě)字母temp->pList->AddString(s_Time+str+bufferin);/ 在指定列表框添加內(nèi)容m_Buffer.AddString(bufferin);/在緩沖區(qū)列表框添加內(nèi)容in=(in+1)%BUFFER_SIZE;/循環(huán)隊(duì)列指針加 1Sleep(t);/ 函數(shù)阻塞時(shí)間ReleaseMutex(h_Mutex);/釋放互斥量ReleaseSemaphore(bufferEmptySemaphore,1,NULL);/ 釋放信號(hào)量 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ī)時(shí)間 (15 秒)c_Time=CTime:GetCurrentTime();/ 獲取當(dāng)前系統(tǒng)時(shí)間s_Time=c_Time.Format("%H:%M:%S ");/ 格式化時(shí)間WaitForSingleObject(bufferEmptySemaphore,INFINITE);/等待信號(hào)量
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)隊(duì)列加 1Sleep(t); / 函數(shù)阻塞時(shí)間 ReleaseMutex(h_Mutex);/釋放互斥量ReleaseSemaphore(bufferFullSemaphore,1,NULL); / 釋放信號(hào)量 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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年旅游服務(wù)代理合同樣本
- 2025年度綠植花卉租賃與城市景觀提升合同范本4篇
- 2025年度綠化工程環(huán)境保護(hù)與節(jié)能減排合同范本4篇
- 2025版綠色建筑項(xiàng)目租賃與能源管理合同4篇
- 2025年度個(gè)人二手房交易安全協(xié)議范本4篇
- 個(gè)人間短期資金周轉(zhuǎn)合同書(shū)版
- 個(gè)人買(mǎi)賣(mài)合同范文(2024版)
- 二零二五年度風(fēng)力發(fā)電機(jī)組安裝及運(yùn)營(yíng)維護(hù)協(xié)議3篇
- 2025年度個(gè)稅起征點(diǎn)調(diào)整下簽勞務(wù)合同稅務(wù)籌劃合作協(xié)議
- 二零二五年度素食餐飲品牌授權(quán)合作合同
- 車(chē)站值班員(中級(jí))鐵路職業(yè)技能鑒定考試題及答案
- 極簡(jiǎn)統(tǒng)計(jì)學(xué)(中文版)
- JTG∕T E61-2014 公路路面技術(shù)狀況自動(dòng)化檢測(cè)規(guī)程
- 高中英語(yǔ)短語(yǔ)大全(打印版)
- 2024年資格考試-對(duì)外漢語(yǔ)教師資格證筆試參考題庫(kù)含答案
- 軟件研發(fā)安全管理制度
- 三位數(shù)除以兩位數(shù)-豎式運(yùn)算300題
- 寺院消防安全培訓(xùn)課件
- 比摩阻-管徑-流量計(jì)算公式
- GB/T 42430-2023血液、尿液中乙醇、甲醇、正丙醇、丙酮、異丙醇和正丁醇檢驗(yàn)
- 五年級(jí)數(shù)學(xué)應(yīng)用題100道
評(píng)論
0/150
提交評(píng)論