版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)進(jìn)程同步與互斥實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)序號(hào):01 實(shí)驗(yàn)項(xiàng)目名稱:進(jìn)程同步與互斥學(xué)號(hào)姓名專業(yè)、班實(shí)驗(yàn)地點(diǎn)指導(dǎo)教師時(shí)間一、實(shí)驗(yàn)?zāi)康?、掌握基本的進(jìn)程同步與互斥算法,理解生產(chǎn)者-消費(fèi)者問(wèn)題。2、學(xué)習(xí)使用Windows 2000/XP中基本的同步對(duì)象,掌握相關(guān)API的使用方法。3、了解Windows 2000/XP中多線程的并發(fā)執(zhí)行機(jī)制,實(shí)現(xiàn)進(jìn)程的同步與互斥。4、設(shè)計(jì)程序,實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者進(jìn)程(線程)的同步與互斥;二、實(shí)驗(yàn)環(huán)境Windows 2000/XP + Visual C+ 6.0
2、 三、實(shí)驗(yàn)內(nèi)容以生產(chǎn)者-消費(fèi)者模型為依據(jù),在Windows 2000/XP環(huán)境下創(chuàng)建一個(gè)控制臺(tái)進(jìn)程,在該進(jìn)程中創(chuàng)建n個(gè)線程模擬生產(chǎn)者和消費(fèi)者,實(shí)現(xiàn)進(jìn)程(線程)的同步與互斥。四、設(shè)計(jì)思路和流程框圖生產(chǎn)者進(jìn)程的功能:生產(chǎn)東西,供消費(fèi)者消費(fèi);消費(fèi)者進(jìn)程的功能:消費(fèi)生產(chǎn)者生產(chǎn)的東西。生產(chǎn)者生產(chǎn)產(chǎn)品并存入緩沖區(qū)供消費(fèi)者取走使用,消費(fèi)者從緩沖器內(nèi)取出產(chǎn)品去消費(fèi)。在生產(chǎn)者和消費(fèi)者同時(shí)工作時(shí),必須禁止生產(chǎn)者將產(chǎn)品放入已裝滿的緩沖器內(nèi),禁止消費(fèi)者從空緩沖器內(nèi)取產(chǎn)品。五、源程序(含注釋)清單#include#include#include#include#include/定義一些常量;/本程序允許的最大臨界區(qū)數(shù);
3、#define MAX_BUFFER_NUM10/秒到微秒的乘法因子;#define INTE_PER_SEC 1000/本程序允許的生產(chǎn)和消費(fèi)線程的總數(shù);#define MAX_THREAD_NUM 64/定義一個(gè)結(jié)構(gòu),記錄在測(cè)試文件中指定的每一個(gè)線程的參數(shù)struct ThreadInfointserial;/線程序列號(hào)charentity; /是P還是Cdoubledelay;/線程延遲intthread_requestMAX_THREAD_NUM; /線程請(qǐng)求隊(duì)列intn_request;/請(qǐng)求個(gè)數(shù);/全局變量的定義/臨界區(qū)對(duì)象的聲明,用于管理緩沖區(qū)的互斥訪問(wèn);CRITICAL_SEC
4、TIONPC_CriticalMAX_BUFFER_NUM;int Buffer_CriticalMAX_BUFFER_NUM; /緩沖區(qū)聲明,用于存放產(chǎn)品;HANDLE h_ThreadMAX_THREAD_NUM; /用于存儲(chǔ)每個(gè)線程句柄的數(shù)組;ThreadInfoThread_InfoMAX_THREAD_NUM; /線程信息數(shù)組;HANDLEempty_semaphore; /一個(gè)信號(hào)量;HANDLEh_mutex; /一個(gè)互斥量;DWORDn_Thread = 0; /實(shí)際的線程的數(shù)目;DWORDn_Buffer_or_Critical; /實(shí)際的緩沖區(qū)或者臨界區(qū)的數(shù)目;HANDLE
5、h_SemaphoreMAX_THREAD_NUM; /生產(chǎn)者允許消費(fèi)者開(kāi)始消費(fèi)的信號(hào)量;/生產(chǎn)消費(fèi)及輔助函數(shù)的聲明void Produce(void *p);void Consume(void *p);bool IfInOtherRequest(int);int FindProducePositon();int FindBufferPosition(int);int main(void)/聲明所需變量;DWORDwait_for_all;ifstreaminFile;/初始化緩沖區(qū);for(int i=0;i MAX_BUFFER_NUM;i+)Buffer_Criticali = -1;/
6、初始化每個(gè)線程的請(qǐng)求隊(duì)列;for(int j=0;jMAX_THREAD_NUM;j+)for(int k=0;kMAX_THREAD_NUM;k+)Thread_Infoj.thread_requestk = -1;Thread_Infoj.n_request = 0;/初始化臨界區(qū);for(i =0;i n_Buffer_or_Critical;inFile.get();printf(輸入文件是:n);/回顯獲得的緩沖區(qū)的數(shù)目信息;printf(%d n,(int) n_Buffer_or_Critical);/提取每個(gè)線程的信息到相應(yīng)數(shù)據(jù)結(jié)構(gòu)中;while(inFile)inFile T
7、hread_Infon_Thread.serial;inFile Thread_Infon_Thread.entity;inFile Thread_Infon_Thread.delay;char c;inFile.get(c);while(c!=n& !inFile.eof() inFile Thread_Infon_Thread.thread_requestThread_Infon_Thread.n_request+; inFile.get(c);n_Thread+; /回顯獲得的線程信息,便于確認(rèn)正確性;for(j=0;j(int) n_Thread;j+)int Temp_serial
8、= Thread_Infoj.serial;char Temp_entity = Thread_Infoj.entity;double Temp_delay = Thread_Infoj.delay;printf( n thread%2d %c %f ,Temp_serial,Temp_entity,Temp_delay);int Temp_request = Thread_Infoj.n_request;for(int k=0;kTemp_request;k+)printf( %d , Thread_Infoj.thread_requestk);coutendl;printf(nn); /創(chuàng)
9、建在模擬過(guò)程中幾個(gè)必要的信號(hào)量empty_semaphore=CreateSemaphore(NULL,n_Buffer_or_Critical,n_Buffer_or_Critical, semaphore_for_empty);h_mutex= CreateMutex(NULL,FALSE,mutex_for_update);/下面這個(gè)循環(huán)用線程的ID號(hào)來(lái)為相應(yīng)生產(chǎn)線程的產(chǎn)品讀寫(xiě)時(shí)所/使用的同步信號(hào)量命名;for(j=0;j(int)n_Thread;j+) std:string lp =semaphore_for_produce_;int temp =j;while(temp)char
10、c = (char)(temp%10);lp+=c;temp/=10;h_Semaphorej+1=CreateSemaphore(NULL,0,n_Thread,lp.c_str();/創(chuàng)建生產(chǎn)者和消費(fèi)者線程;for(i =0;i (int) n_Thread;i+)if(Thread_Infoi.entity =P)h_Threadi= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce),&(Thread_Infoi),0,NULL);else h_Threadi=CreateThread(NULL,0,(LPTHREAD_START
11、_ROUTINE)(Consume),&(Thread_Infoi),0,NULL);/主程序等待各個(gè)線程的動(dòng)作結(jié)束;wait_for_all = WaitForMultipleObjects(n_Thread,h_Thread,TRUE,-1);printf( n nALL Producer and consumer have finished their work. n);printf(Press any key to quit!n);_getch();return 0;/確認(rèn)是否還有對(duì)同一產(chǎn)品的消費(fèi)請(qǐng)求未執(zhí)行;bool IfInOtherRequest(int req)for(int i
12、=0;in_Thread;i+)for(int j=0;jThread_Infoi.n_request;j+)if(Thread_Infoi.thread_requestj = req)return TRUE;return FALSE;/找出當(dāng)前可以進(jìn)行產(chǎn)品生產(chǎn)的空緩沖區(qū)位置;intFindProducePosition()int EmptyPosition;for (int i =0;in_Buffer_or_Critical;i+)if(Buffer_Criticali = -1)EmptyPosition = i;/用下面這個(gè)特殊值表示本緩沖區(qū)正處于被寫(xiě)狀態(tài);Buffer_Critica
13、li = -2;break;return EmptyPosition;/找出當(dāng)前所需生產(chǎn)者生產(chǎn)的產(chǎn)品的位置;int FindBufferPosition(int ProPos)int TempPos;for (int i =0 ;iserial;m_delay = (DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC);Sleep(m_delay);/開(kāi)始請(qǐng)求生產(chǎn)printf(Producer %2d sends the produce require.n,m_serial);/確認(rèn)有空緩沖區(qū)可供生產(chǎn),同時(shí)將空位置數(shù)empty減1;用于生產(chǎn)者和消費(fèi)者的同步;w
14、ait_for_semaphore= WaitForSingleObject(empty_semaphore,-1);/互斥訪問(wèn)下一個(gè)可用于生產(chǎn)的空臨界區(qū),實(shí)現(xiàn)寫(xiě)寫(xiě)互斥;wait_for_mutex = WaitForSingleObject(h_mutex,-1);int ProducePos = FindProducePosition(); ReleaseMutex(h_mutex);/生產(chǎn)者在獲得自己的空位置并做上標(biāo)記后,以下的寫(xiě)操作在生產(chǎn)者之間可以并發(fā);/核心生產(chǎn)步驟中,程序?qū)⑸a(chǎn)者的ID作為產(chǎn)品編號(hào)放入,方便消費(fèi)者識(shí)別;printf(Producer %2d begin to pro
15、duce at position %2d.n,m_serial,ProducePos);Buffer_CriticalProducePos = m_serial;printf(Producer %2d finish producing :n ,m_serial);printf( position %2d :%3d n ,ProducePos,Buffer_CriticalProducePos);/使生產(chǎn)者寫(xiě)的緩沖區(qū)可以被多個(gè)消費(fèi)者使用,實(shí)現(xiàn)讀寫(xiě)同步;ReleaseSemaphore(h_Semaphorem_serial,n_Thread,NULL);/消費(fèi)者進(jìn)程void Consume(vo
16、id * p)/局部變量聲明;DWORDwait_for_semaphore,m_delay;intm_serial,m_requestNum; /消費(fèi)者的序列號(hào)和請(qǐng)求的數(shù)目;intm_thread_requestMAX_THREAD_NUM;/本消費(fèi)線程的請(qǐng)求隊(duì)列;/提取本線程的信息到本地;m_serial = (ThreadInfo*)(p)-serial;m_delay = (DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC);m_requestNum = (ThreadInfo *)(p)-n_request;for (int i = 0;ithre
17、ad_requesti;Sleep(m_delay);/循環(huán)進(jìn)行所需產(chǎn)品的消費(fèi)for(i =0;ithread_requesti =-1; if(!IfInOtherRequest(m_thread_requesti)Buffer_CriticalBufferPos = -1;/標(biāo)記緩沖區(qū)為空;printf(Consumer%2d finish consuming %2d:n ,m_serial,m_thread_requesti);printf( position %2d :%3d n ,BufferPos,Buffer_CriticalBufferPos);ReleaseSemaphore(empty_semaphore,1,NULL); elseprintf(Consumer %2d finish consuming product %2dn ,m_serial,m_thread_requesti); /離開(kāi)臨界區(qū) LeaveCriticalSection(&PC_CriticalBufferPos);六、測(cè)試結(jié)果以及實(shí)驗(yàn)總結(jié)通過(guò)實(shí)驗(yàn)進(jìn)一步了解了基本的進(jìn)程同步與互斥算法,理解生產(chǎn)者-消費(fèi)者問(wèn)題2、掌握了相關(guān)
溫馨提示
- 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年智能家居地板集成安裝與智慧家居控制合同
- 2024年貨物交易合同示范文本
- 2025年度水資源保護(hù)與供用水責(zé)任合同范本3篇
- 煉鋼車(chē)間電爐施工方案
- 2024-2030年中國(guó)互聯(lián)網(wǎng)+音樂(lè)行業(yè)市場(chǎng)深度分析及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 2025版二手房買(mǎi)賣(mài)合同糾紛調(diào)解規(guī)則3篇
- 二零二五年度體育用品銷(xiāo)售代理與場(chǎng)館教練服務(wù)合同樣本3篇
- 2024年虛擬現(xiàn)實(shí)技術(shù)授權(quán)開(kāi)發(fā)合同3篇
- 2024年長(zhǎng)江中上游流域造林補(bǔ)償合同3篇
- 2024年酒店整體租賃合同條款
- 中南大學(xué)《大學(xué)物理C(3)(一)》2022-2023學(xué)年第一學(xué)期期末試卷
- 齊魯名家 談方論藥智慧樹(shù)知到期末考試答案2024年
- 南京工業(yè)大學(xué)橋梁工程課程設(shè)計(jì)
- 物理學(xué)習(xí)的8種思考方式
- 閱讀題賒小雞
- 中國(guó)風(fēng)圍棋對(duì)弈雅致文藝教育培訓(xùn)活動(dòng)策劃版
- 基于51單片機(jī)的簡(jiǎn)易計(jì)算器時(shí)間顯示(LCD1602顯示)
- 2022國(guó)開(kāi)大學(xué)電大??啤掇r(nóng)科基礎(chǔ)化學(xué)》期末試題及答案
- 《眼睛結(jié)構(gòu)與功能》PPT課件.ppt
- 村委會(huì)實(shí)虛線信紙.
- GB∕T 39757-2021 建筑施工機(jī)械與設(shè)備 混凝土泵和泵車(chē)安全使用規(guī)程
評(píng)論
0/150
提交評(píng)論