版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 南昌大學(xué)實驗報告學(xué)生姓名: 倪煥 學(xué) 號: 專業(yè)班級: 軟件工程141班 實驗類型: 驗證 綜合 設(shè)計 創(chuàng)新 實驗日期: 2016.5.24 實驗成績: 一、 實驗項目名稱 哲學(xué)家就餐問題二、實驗?zāi)康?利用PV操作解決生產(chǎn)者消費者問題3、 軟硬件環(huán)境 軟件:Visual Studio2010 硬件:PC機一臺4、 實驗內(nèi)容結(jié)果一、實現(xiàn)代碼 3個生產(chǎn)者1個消費者 ,生產(chǎn)者會等待消費者#include #include const unsigned short SIZE_OF_BUFFER = 10; /緩沖區(qū)長度unsigned short ProductID = 0; /產(chǎn)品號unsigne
2、d short ConsumeID = 0; /將被消耗的產(chǎn)品號unsigned short in = 0; /產(chǎn)品進(jìn)緩沖區(qū)時的緩沖區(qū)下標(biāo)unsigned short out = 0; /產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標(biāo)int g_bufferSIZE_OF_BUFFER; /緩沖區(qū)是個循環(huán)隊列bool g_continue = true; /控制程序結(jié)束HANDLE g_hMutex; /用于線程間的互斥HANDLE g_hFullSemaphore; /當(dāng)緩沖區(qū)滿時迫使生產(chǎn)者等待HANDLE g_hEmptySemaphore; /當(dāng)緩沖區(qū)空時迫使消費者等待DWORD WINAPI Produc
3、er(LPVOID); /生產(chǎn)者線程DWORD WINAPI Consumer(LPVOID); /消費者線程int main() /創(chuàng)建各個互斥信號 g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); /調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當(dāng)生產(chǎn)者個數(shù)多于消費者個數(shù)時, /生產(chǎn)速度
4、快,生產(chǎn)者經(jīng)常等待消費者;反之,消費者經(jīng)常等待 const unsigned short PRODUCERS_COUNT = 3; /生產(chǎn)者的個數(shù) const unsigned short CONSUMERS_COUNT = 1; /消費者的個數(shù) /總的線程數(shù) const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_COUNT; /各線程的handle DWORD producerIDCONSUMERS_COUNT; /生產(chǎn)者線程的標(biāo)識符 DWORD consu
5、merIDTHREADS_COUNT; /消費者線程的標(biāo)識符 /創(chuàng)建生產(chǎn)者線程 for (int i=0;iPRODUCERS_COUNT;+i) hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1; /創(chuàng)建消費者線程 for (int i=0;iCONSUMERS_COUNT;+i) hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDi); if (hThreadsi=
6、NULL) return -1; while(g_continue) if(getchar() /按回車后終止程序運行 g_continue = false; return 0;/生產(chǎn)一個產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的ID號void Produce() std:cerr Producing +ProductID . ; std:cerr Succeed std:endl;/把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)void Append() std:cerr Appending a product . ; g_bufferin = ProductID; in = (in+1)%SIZE_OF_BUFFER
7、; std:cerr Succeed std:endl; /輸出緩沖區(qū)當(dāng)前的狀態(tài) for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i : g_bufferi; if (i=in) std:cout - 生產(chǎn); if (i=out) std:cout - 消費; std:cout std:endl; /從緩沖區(qū)中取出一個產(chǎn)品void Take() std:cerr Taking a product . ; ConsumeID = g_bufferout; out = (out+1)%SIZE_OF_BUFFER; std:cerr Succeed std:en
8、dl; /輸出緩沖區(qū)當(dāng)前的狀態(tài) for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i : g_bufferi; if (i=in) std:cout - 生產(chǎn); if (i=out) std:cout - 消費; std:cout std:endl; /消耗一個產(chǎn)品void Consume() std:cerr Consuming ConsumeID . ; std:cerr Succeed std:endl;/生產(chǎn)者DWORD WINAPI Producer(LPVOID lpPara) while(g_continue) WaitForSingleObje
9、ct(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0;/消費者DWORD WINAPI Consumer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSin
10、gleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0; 二、實現(xiàn)代碼 一個生產(chǎn)者一個消費者 /* 用信號量解決生產(chǎn)者消費者問題 */ #include #define N 10 typedef int semaphore; /* 信號量是一種特殊的整型變量 */ semaphore mutex=1; /* 互斥訪問 */ semaphore empty=N; /* 記錄緩沖區(qū)
11、中空的槽數(shù) */ semaphore full=0; /* 記錄緩沖區(qū)中滿的槽數(shù)*/ semaphore bufN; /* 有N個槽數(shù)的緩沖區(qū)bufN,并實現(xiàn)循環(huán)緩沖隊列 */ semaphore front=0, rear=0; void p(semaphore *x) /* p操作 */ *x=(*x)-1; void v(semaphore *y) /* v操作 */ *y=(*y)+1; void produce_item(int *item_ptr) /*printf(produce an itemn);*/ *item_ptr=m; /* m is man滿 */ void ent
12、er_item(int x) front=(front+1)%N; buffront=x; printf(enter_item %c to buf%dn, buffront, front); void remove_item(int *yy) rear=(rear+1)%N; printf(remove_item %c from buf%d, bufrear, rear); *yy=bufrear; bufrear=k; /* k is kong空 */ printf( so the buf%d changed to empty-%cn, rear, bufrear); void consum
13、e_item(int y) printf(cosume the item :the screem print %cn, y); void producer(void); void consumer(void); /* 生產(chǎn)者 */ void producer(void) int item; while(1) produce_item(&item); p(&empty); /* 遞減空槽數(shù) */ p(&mutex); /* 進(jìn)入臨界區(qū) */ enter_item(item); /* 將一個新的數(shù)據(jù)項放入緩沖區(qū) */ v(&mutex); /* 離開臨界區(qū) */ v(&full); /* 遞增滿槽數(shù) */ if(full=N) /* 若緩沖區(qū)滿的話,喚醒消費者進(jìn)程 */ consumer(); /* 消費者 */ void consumer(void) int get_item; while(1) p(&full); /* 遞減滿槽數(shù) */ p(&mutex); /* 進(jìn)入臨界區(qū) */ remove_item(&get_item); /* 從緩沖區(qū)中取走一個數(shù)據(jù)項 */ v(&mutex); /* 離開臨界區(qū) */ v(&empty); /* 遞增空槽數(shù) */ consume_item(get_item); /* 對數(shù)據(jù)項進(jìn)行操作(消費)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025廣東省超康投資有限公司招聘副總經(jīng)理1人(公共基礎(chǔ)知識)綜合能力測試題附答案
- 2026廣東東莞市沙田鎮(zhèn)社區(qū)衛(wèi)生服務(wù)中心第一期招聘納入崗位管理編制外人員4人筆試模擬試題及答案解析
- 2025年河北石家莊平山縣公開選調(diào)機關(guān)事業(yè)單位工作人員28名備考題庫附答案
- 2025廣西河池都安瑤族自治縣公開招聘國有企業(yè)領(lǐng)導(dǎo)班子人員2考前自測高頻考點模擬試題附答案
- 2025年陜西省第二人民醫(yī)院招聘(3人)考試參考題庫附答案
- 2025廣東廣州醫(yī)科大學(xué)呼吸疾病全國重點實驗室辦公室招聘編外人員1名(公共基礎(chǔ)知識)測試題附答案
- 2025年11月重慶市萬州區(qū)太白街道辦事處公益性崗位招聘6人(公共基礎(chǔ)知識)測試題附答案
- 2026四川自貢市第一人民醫(yī)院招聘醫(yī)療輔助崗人員10人筆試備考試題及答案解析
- 2026中國科學(xué)院力學(xué)研究所超常環(huán)境非線性力學(xué)全國重點實驗室辦公室管理人員招聘1人筆試備考試題及答案解析
- 2025秋人教版道德與法治八年級上冊7.2踐行平等課件
- 2026年包頭輕工職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試參考題庫及答案詳解
- 2026貴州黔南州長順縣醫(yī)療集團(tuán)中心醫(yī)院招聘備案編制人員21人筆試參考題庫及答案解析
- 中國兒童原發(fā)性免疫性血小板減少癥診斷與治療改編指南(2025版)
- 2026年遼寧生態(tài)工程職業(yè)學(xué)院單招綜合素質(zhì)考試題庫附答案詳解
- 基坑回填質(zhì)量控制措施
- 2025重慶城口縣國有企業(yè)公開招聘26人參考題庫附答案
- 應(yīng)力性骨折課件
- 醫(yī)?;鸨O(jiān)管培訓(xùn)課件
- 新型醫(yī)療器械應(yīng)用評估報告
- 大數(shù)據(jù)分析在供熱中的應(yīng)用方案
- 污泥安全管理制度范本
評論
0/150
提交評論