版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、文檔來(lái)源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持操作系統(tǒng)課程設(shè)計(jì)生產(chǎn)者和消費(fèi)者問(wèn)題系院:計(jì)算機(jī)科學(xué)系學(xué)生姓名:韓旭學(xué)號(hào):01專(zhuān)業(yè):計(jì)算機(jī)科學(xué)與技術(shù)年級(jí):0701B完成日期:2009年11月指導(dǎo)教師:劉栓、課程設(shè)計(jì)的性質(zhì)與任務(wù)1、生產(chǎn)者-消費(fèi)者問(wèn)題是很經(jīng)典很具有代表性的進(jìn)程同步問(wèn)題,計(jì)算機(jī)中的很多同步問(wèn)題都可抽象為生產(chǎn)者-消費(fèi)者問(wèn)題,通過(guò)本實(shí)驗(yàn)的練習(xí),希望能加深學(xué)生對(duì)進(jìn)程同步問(wèn)題的認(rèn)識(shí)與理解。2、熟悉VC的使用,培養(yǎng)和提高學(xué)生的分析問(wèn)題、解決問(wèn)題的能力。二、課程設(shè)計(jì)的內(nèi)容及其要求1 .實(shí)驗(yàn)內(nèi)容以生產(chǎn)者/消費(fèi)者模型為依據(jù),在Windows2000環(huán)境下創(chuàng)建一個(gè)控制臺(tái)進(jìn)程,在該進(jìn)程中創(chuàng)建
2、n個(gè)線(xiàn)程模擬生產(chǎn)者和消費(fèi)者,實(shí)現(xiàn)進(jìn)程(線(xiàn)程)的同步與互斥。2 .實(shí)驗(yàn)要求學(xué)習(xí)并理解生產(chǎn)者/消費(fèi)者模型及其同步/互斥規(guī)則;學(xué)習(xí)了解Windows同步對(duì)象及其特性;熟悉實(shí)驗(yàn)環(huán)境,掌握相關(guān)API的使用方法;設(shè)計(jì)程序,實(shí)現(xiàn)生產(chǎn)者/消費(fèi)者進(jìn)程(線(xiàn)程)的同步與互斥;提交實(shí)驗(yàn)報(bào)告。三、課程設(shè)計(jì)的時(shí)間安排1、分析問(wèn)題,給出數(shù)學(xué)模型,選擇數(shù)據(jù)結(jié)構(gòu),2課時(shí)四、課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境本實(shí)驗(yàn)是在win2000+VC6.0環(huán)境下實(shí)現(xiàn)的,利用WindowsSDK編制實(shí)例程序。所以試驗(yàn)需要在windows下安裝VC后進(jìn)行。VC是一個(gè)集成開(kāi)發(fā)環(huán)境,其中包含了WindowsSDK所有工具和定義;所以安裝了VC后就不用特意安裝SDK
3、了。五、正文1、實(shí)驗(yàn)程序的結(jié)構(gòu)圖(流程圖);2、數(shù)據(jù)結(jié)構(gòu)及信號(hào)量定義的說(shuō)明;CreateThread功能一一創(chuàng)建一個(gè)在調(diào)用進(jìn)程的地址空間中執(zhí)行的線(xiàn)程格式HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParamiter,DWORDdwCreationFlags,LpdwordlpThread);參數(shù)說(shuō)明lpThreadAttributes指向一個(gè)LPSECURITY_ATTRIBUTES(新線(xiàn)程的安全性
4、描述符)。dwStackSize定義原始堆棧大小。lpStartAddress指向使用LPTHRAED_START_ROUTINE類(lèi)型定義的函數(shù)。lpParamiter定義一個(gè)給進(jìn)程傳遞參數(shù)的指針。dwCreationFlags定義控制線(xiàn)程創(chuàng)建的附加標(biāo)志。lpThread保存線(xiàn)程標(biāo)志符(32位)(2) CreateMutex功能創(chuàng)建一個(gè)命名或匿名的互斥量對(duì)象格式HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,BOOLbInitialOwner,LPCTSTRlpName);參數(shù)說(shuō)明lpMutexAttributes必須取值NUL
5、L。bInitialOwner指示當(dāng)前線(xiàn)程是否馬上擁有該互斥量(即馬上加鎖)。lpName互斥量名稱(chēng)。(3) CreateSemaphore功能一一創(chuàng)建一個(gè)命名或匿名的信號(hào)量對(duì)象格式HANDLECreateSemaphore(LPSECURITY_ATTRIBUTESIpSemaphoreAttributes,LONGlInitialCount,LONGlMaximumCount,LPCTSTRlpName);參數(shù)說(shuō)明lpSemaphoreAttributes必須取值NULL。lInitialCount信號(hào)量的初始值。該值大于0,但小于lMaximumCount指定的最大值。lMaximumC
6、ount信號(hào)量的最大值。lpName信號(hào)量名稱(chēng)。(4) WaitForSingleObject功能一一使程序處于等待狀態(tài),直到信號(hào)量hHandle出現(xiàn)(即其值大于等于1)或超過(guò)規(guī)定的等待時(shí)間格式DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);參數(shù)說(shuō)明hHandle信號(hào)量指針。dwMilliseconds等待的最長(zhǎng)時(shí)間(INFINITE為無(wú)限等待)。(5) ReleaseSemaphore功能一一對(duì)指定信號(hào)量加上一個(gè)指定大小的量。成功執(zhí)行則返回非0值格式BOOLReleaseSemaphore(HANDLEhSemaphor
7、e,LONGlReleaseCount,LPLONGlppreviousCount);參數(shù)說(shuō)明hSemaphore信號(hào)量指針。lReleaseCount信號(hào)量的增量。lppreviousCount保存信號(hào)量當(dāng)前值。(6) ReleaseMutex功能一一打開(kāi)互斥鎖,即把互斥量加1。成功調(diào)用則返回0格式BOOLReleaseMutex(HANDLEhMutex);參數(shù)說(shuō)明hMutex互斥量指針。(7) InitializeCriticalSection功能初始化臨界區(qū)對(duì)象格式VOIDInitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSec
8、tion);參數(shù)說(shuō)明lpCriticalSection指向臨界區(qū)對(duì)象的指針。(8) EnterCriticalSection功能一一等待指定臨界區(qū)對(duì)象的所有權(quán)格式VOIDenterCriticalSection(LPCRITICALSECTIONlpCriticalSection);參數(shù)說(shuō)明IpCriticalSection指向臨界區(qū)對(duì)象的指針。(9) LeaveCriticalSection功能一一釋放指定臨界區(qū)對(duì)象的所有權(quán)格式VOIDLeaveCriticalSection(LPCRITICAL_SECTIONIpCriticalSection);參數(shù)說(shuō)明lpCriticalSection
9、指向臨界區(qū)對(duì)象的指針。3、實(shí)驗(yàn)的步驟;(1)打開(kāi)VC,選擇菜單項(xiàng)file->new,選擇projects選項(xiàng)卡并建立一個(gè)名為"R_WP1"的Win32consoleapplicatoin工程;創(chuàng)建時(shí)注意指定創(chuàng)建該工程的目在工程中創(chuàng)建源文件"R_WP1.cpp":選擇菜單項(xiàng)project->addtoproject->files,在選擇框中輸入自己想要?jiǎng)?chuàng)建的文件名,這里是"R_WP1.cpp"在接下來(lái)詢(xún)問(wèn)是否創(chuàng)建新文件時(shí)回答“yes”;然后通過(guò)Workspace->FileView->SourceFiles
10、打開(kāi)該文件,在其中編輯源文件并保存.(3)通過(guò)調(diào)用菜單命令項(xiàng)build->buildall進(jìn)行編譯連接,可以在指定的工程目錄下得到debug->R_WP1.exe程序,然后把給定的test.txt文件存入該debug目錄下,就可以在控制臺(tái)進(jìn)入該debug目錄運(yùn)行程序了。需要強(qiáng)調(diào)的是在創(chuàng)建數(shù)據(jù)文件時(shí),由于涉及到文件格式問(wèn)題,最好在記事本中手工逐個(gè)輸入數(shù)據(jù),而不要拷貝粘貼數(shù)據(jù)。4、實(shí)驗(yàn)源程序;#include<windows.h>#include<fstream.h>#include<stdio.h>#include<string>#in
11、clude<conio.h>/定義一些常量;/本程序允許的最大臨界區(qū)數(shù);#defineMAX_BUFFER_NUM10秒到微秒的乘法因子;#defineINTE_PER_SEC1000/本程序允許而生產(chǎn)和消費(fèi)線(xiàn)程的總數(shù);#defineMAX_THREAD_NUM64定義一個(gè)結(jié)局,記錄刀測(cè)試文件中指定的每一個(gè)線(xiàn)程的參數(shù)structThreadinfointserial;/線(xiàn)程序列號(hào)charentity;是P還是Cdoubledelay;線(xiàn)程延遲intthread_requestMAX_THREAD_NUM;/線(xiàn)程請(qǐng)求隊(duì)列intnrequest;/請(qǐng)求個(gè)數(shù);/全局變量的定義臨界區(qū)對(duì)象的
12、聲明,用于管理緩沖區(qū)的互斥訪(fǎng)問(wèn);CRITICAL_SECTIONPC_CriticalMAX_BUFFER_NUM;intBuffer_CriticalMAX_BUFFER_NUM;緩沖區(qū)聲明,用于存放產(chǎn)HANDLEh_ThreadMAX_THREAD_NUM;/用于存儲(chǔ)每個(gè)線(xiàn)程句柄的數(shù)組;ThreadinfoThread_InfoMAX_THREAD_NUM;/線(xiàn)程信息數(shù)組;HANDLEempty_semaphore;/一個(gè)信號(hào)量;HANDLEh_mutex;一個(gè)互斥量;DWORDn_Thread=0;/實(shí)際的線(xiàn)程的數(shù)目;DWORDn_Buffer_or_Critical;/實(shí)際的緩沖區(qū)或者
13、臨界區(qū)的數(shù)目;HANDLEh_SemaphoreMAX_THREAD_NUM;/生產(chǎn)者允許消費(fèi)者開(kāi)始消費(fèi)的信號(hào)量;/生產(chǎn)消費(fèi)及輔助函數(shù)的聲明voidProduce(void*p);voidConsume(void*p);boolIfinOtherRequest(int);intFindProducePositon();intFindBufferPosition(int);intmain(void)聲明所需變量;DWORDwait_for_all;ifstreaminFile;/初始化緩沖區(qū);for(inti=0;i<MAX_BUFFER_NUM;i+)Buffer_Criticali=-
14、1;/初始化工;個(gè)線(xiàn)程的請(qǐng)求隊(duì)列;for(intj=0;j<MAX_THREAD_NUM;j+)for(intk=0;k<MAX_THREAD_NUM;k+)Thread_Infoj.thread_requestk=-1;Thread_Infoj.n_request=0;/初始化臨界區(qū);for(i=0;i<MAX_BUFFER_NUM;i+)InitializeCriticalSection(&PC_Criticali);打開(kāi)輸入文件,按照規(guī)定的格式提取線(xiàn)程等信息;inFile.open("test.txt");/從文件中獲得實(shí)際的緩沖區(qū)的數(shù)目;i
15、nFile>>n_Buffer_or_Critical;inFile.get();printf("輸入文件是:n");/回顯獲得的緩沖區(qū)的數(shù)目信息;printf("%dn",(int)n_Buffer_or_Critical);/提取每個(gè)線(xiàn)程的點(diǎn)息到相氐或據(jù)結(jié)構(gòu)中;while(inFile)inFile>>Thread_Infon_Thread.serial;inFile>>Thread_Infon_Thread.entity;inFile>>Thread_Infon_Thread.delay;charc;
16、inFile.get(c);while(c!='n'&&!inFile.eof()inFile>>Thread_Infon_Thread.thread_requestThread_Infon_Thread.n_request+;inFile.get(c);n_Thread+;回顯獲得的線(xiàn)程信息,便于確認(rèn)正確性;for(j=0;j<(int)n_Thread;j+)intTemp_serial=Thread_Infoj.serial;charTemp_entity=Thread_Infoj.entity;doubleTemp_delay=Thre
17、ad_Infoj.delay;printf("nthread%2d%c%f”,Temp_serial,Temp_entity,Temp_delay);intTemp_request=Thread_Infoj.n_request;for(intk=0;k<Temp_request;k+)printf("%d",Thread_Infoj.thread_requestk);cout<<endl;printf("nn");/創(chuàng)建在模擬過(guò)程中幾個(gè)必要的信號(hào)量empty_semaphore=CreateSemaphore(NULL,n_B
18、uffer_or_Critical,n_Buffer_or_Critical,"semaphore_for_empty");h_mutex=CreateMutex(NULL,FALSE,"mutex_for_update");/下面這個(gè)循環(huán)用線(xiàn)程的ID號(hào)來(lái)為相應(yīng)生產(chǎn)線(xiàn)程的產(chǎn)品讀寫(xiě)時(shí)所使用的同步信號(hào)量命名;for(j=0;j<(int)n_Thread;j+)std二stringlp="semaphore_for_produce_"inttemp=j;while(temp)charc=(char)(temp%10);lp+=c;t
19、emp/=10;h_Semaphorej+1=CreateSemaphore(NULL,0,n_Thread,lp.c_str();/創(chuàng)建生產(chǎn)者和消費(fèi)者線(xiàn)程;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);elseh_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consu
20、me),&(Thread_Infoi),0,NULL);/主程序等待各個(gè)線(xiàn)程的動(dòng)作結(jié)束;wait_for_all=WaitForMultipleObjects(n_Thread,h_Thread,TRUE,-1);printf("nnALLProducerandconsumerhavefinishedtheirwork.n");printf("Pressanykeytoquit!n");_getch();return0;/確認(rèn)是否還有對(duì)同一產(chǎn)品的消費(fèi)請(qǐng)求未執(zhí)行;boolIfInOtherRequest(intreq)for(inti=0;i<
21、;n_Thread;i+)for(intj=0;j<Thread_Infoi.n_request;j+)if(Thread_Infoi.thread_requestj=req)returnTRUE;returnFALSE;/找出當(dāng)前可以進(jìn)行產(chǎn)品生產(chǎn)的空緩沖區(qū)位置;intFindProducePosition()intEmptyPosition;for(inti=0;i<n_Buffer_or_Critical;i+)if(Buffer_Criticali=-1)EmptyPosition=i;/用下面這個(gè)特殊值表示本緩沖區(qū)正處于被寫(xiě)狀態(tài);Buffer_Criticali=-2;br
22、eak;returnEmptyPosition;/找出當(dāng)前所需生產(chǎn)者生產(chǎn)的產(chǎn)品的位置;intFindBufferPosition(intProPos)intTempPos;for(inti=0;i<n_Buffer_or_Critical;i+)if(Buffer_Criticali=ProPos)TempPos=i;break;returnTempPos;/生產(chǎn)者進(jìn)程voidProduce(void*p)局部變量聲明;DWORDwait_for_semaphore,wait_for_mutex,m_delay;intm_serial;/獲得本婕程的信息;m_serial=(Thread
23、Info*)(p)->serial;m_delay=(DWORD)(ThreadInfo*)(p)->delay*INTE_PER_SEC);Sleep(m_delay);/開(kāi)始請(qǐng)求生產(chǎn)printf("Producer%2dsendstheproducerequire.n",m_serial);確認(rèn)有空緩沖區(qū)可供生產(chǎn),同時(shí)將空位置數(shù)empty減1;用于生產(chǎn)者和消費(fèi)者的同步;wait_for_semaphore=WaitForSingleObject(empty_semaphore,-1);互斥訪(fǎng)問(wèn)下一個(gè)可用于生產(chǎn)的空臨界區(qū),實(shí)現(xiàn)寫(xiě)寫(xiě)互斥;wait_for_mut
24、ex=WaitForSingleObject(h_mutex,-1);intProducePos=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%2dbegintoproduceatposition%2d.n",m_serial,ProducePos);Buffer_CriticalProducePos=m_serial;printf("Produce
25、r%2dfinishproducing:n",m_serial);printf("position%2d:%3dn",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)程voidConsume(void*p)局部變量聲明;DWORDwait_for_semaphore,m_delay;intm_serial,m_requestNum;/消費(fèi)者的序列號(hào)和請(qǐng)求的數(shù)Iintm_t
26、hread_requestMAX_THREAD_NUM;本消費(fèi)線(xiàn)程的請(qǐng)求隊(duì)列;/提取本線(xiàn)程的信息到本地;m_serial=(ThreadInfo*)(p)->serial;m_delay=(DWORD)(ThreadInfo*)(p)->delay*INTE_PER_SEC);m_requestNum=(Threadinfo*)(p)->n_request;for(inti=0;i<m_requestNum;i+)m_thread_requesti=(Threadinfo*)(p)->thread_requesti;Sleep(m_delay);/循環(huán)進(jìn)行所需產(chǎn)品的消費(fèi)for(i=0;i<m_requestNum;i+)/請(qǐng)求消費(fèi)下一個(gè)產(chǎn)品printf("Consumer%2drequesttoconsume%2dproductn",m_serial,m_thread_requesti);如果對(duì)應(yīng)生產(chǎn)者沒(méi)有生產(chǎn),則等待;如果生產(chǎn)了,允許的消費(fèi)者數(shù)目-1;實(shí)現(xiàn)了讀寫(xiě)同步;wait_for_semaphore=WaitForSingleObject(h_Semaphorem_thread_requesti,-1);/查詢(xún)所需產(chǎn)品放到緩沖區(qū)的號(hào)intBufferPos=FindBufferPosition(m_thre
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 石河子大學(xué)《園林設(shè)計(jì)初步》2022-2023學(xué)年第一學(xué)期期末試卷
- 門(mén)衛(wèi)室施工組織設(shè)計(jì)方案
- 石河子大學(xué)《水利工程監(jiān)理》2023-2024學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《臨床技能學(xué)二》2021-2022學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《工業(yè)制劑綜合實(shí)驗(yàn)》2022-2023學(xué)年第一學(xué)期期末試卷
- 沈陽(yáng)理工大學(xué)《數(shù)字信號(hào)處理》2023-2024學(xué)年第一學(xué)期期末試卷
- 沈陽(yáng)理工大學(xué)《面向?qū)ο蟪绦蛟O(shè)計(jì)(C++)》2022-2023學(xué)年期末試卷
- 沈陽(yáng)理工大學(xué)《翻譯技能綜合訓(xùn)練》2022-2023學(xué)年第一學(xué)期期末試卷
- 沈陽(yáng)理工大學(xué)《車(chē)輛振動(dòng)與噪聲控制》2023-2024學(xué)年期末試卷
- 沈陽(yáng)理工大學(xué)《包裝設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 珍惜時(shí)間(課件)小學(xué)生主題班會(huì)通用版
- 家長(zhǎng)學(xué)校資料(全套完整版)
- 品牌管理智慧樹(shù)知到課后章節(jié)答案2023年下齊魯工業(yè)大學(xué)
- 比亞迪財(cái)務(wù)報(bào)表分析
- 水壓試驗(yàn)報(bào)告(帶曲線(xiàn)圖)
- Units68單元大單元教學(xué)設(shè)計(jì)課件英語(yǔ)七年級(jí)上冊(cè)
- 2023年CSCO尿路上皮癌診療指南
- 在高三學(xué)生月考總結(jié)表彰會(huì)上的講話(huà)
- 高價(jià)值醫(yī)療設(shè)備產(chǎn)品定價(jià)過(guò)程
- 保險(xiǎn)行業(yè)創(chuàng)說(shuō)會(huì)-課件
- 初中語(yǔ)文-江城子·密州出獵蘇軾教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
評(píng)論
0/150
提交評(píng)論