版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程設(shè)計(jì)任務(wù)書學(xué) 院信息學(xué)院專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué) 生 姓 名學(xué) 號(hào)題 目讀者與寫者問(wèn)題(進(jìn)程同步問(wèn)題)內(nèi)容及要求:內(nèi)容:讀者與寫者問(wèn)題(進(jìn)程同步問(wèn)題)實(shí)驗(yàn)?zāi)康模毫私膺M(jìn)程同步的概念,理解信號(hào)量機(jī)制的原理,掌握信號(hào)量解決同步問(wèn)題的方法,進(jìn)而學(xué)會(huì)進(jìn)程的同步與互斥。設(shè)計(jì)要求:編程模擬教材中討論讀者與寫者的問(wèn)題,要求能顯示結(jié)果。任務(wù)交付:1.程序源代碼;2課程設(shè)計(jì)論文及電子文檔。進(jìn)度安排:16周確定題目,查找資料,上機(jī)編程;20周上機(jī)編程調(diào)試,驗(yàn)收答辯,提交課程序設(shè)計(jì)報(bào)告書。指導(dǎo)教師(簽字):年 月 日學(xué)院院長(zhǎng)(簽字):年 月 日目 錄一、課程設(shè)計(jì)目的及要求1二、相關(guān)知識(shí)1三、題目分析2四、概要設(shè)計(jì)
2、4五、代碼及流程5六、運(yùn)行結(jié)果11七、設(shè)計(jì)心得12八、參考文獻(xiàn)12一、課程設(shè)計(jì)目的及要求讀者與寫者問(wèn)題(進(jìn)程同步問(wèn)題)用n 個(gè)線程來(lái)表示n個(gè)讀者或?qū)懻摺C總€(gè)線程按相應(yīng)測(cè)試數(shù)據(jù)文件的要求,進(jìn)行讀寫操作。請(qǐng)用信號(hào)量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問(wèn)題。讀者-寫者問(wèn)題的讀寫操作限制:1)寫-寫互斥;2)讀-寫互斥;3)讀-讀允許;寫者優(yōu)先的附加限制:如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一寫者在等待訪問(wèn)共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。二、相關(guān)知識(shí)Windows API:在本實(shí)驗(yàn)中涉及的API 有:1線程控制:CreateThread 完成線程創(chuàng)建,在調(diào)用進(jìn)程的地
3、址空間上創(chuàng)建一個(gè)線程,以執(zhí)行指定的函數(shù);它的返回值為所創(chuàng)建線程的句柄。HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, / SDDWORD dwStackSize, / initial stack sizeLPTHREAD_START_ROUTINE lpStartAddress, / threadfunctionLPVOID lpParameter,/ thread argumentDWORD dwCreationFlags, / creation optionLPDWORD lpThreadId / thread i
4、dentifier);2 ExitThread 用于結(jié)束當(dāng)前線程。VOID ExitThread(DWORD dwExitCode / exit code for this thread);3 Sleep 可在指定的時(shí)間內(nèi)掛起當(dāng)前線程。VOID Sleep(DWORD dwMilliseconds / sleep time);4信號(hào)量控制:WaitForSingleObject 可在指定的時(shí)間內(nèi)等待指定對(duì)象為可用狀態(tài);DWORD WaitForSingleObject(HANDLE hHandle, / handle to objectDWORD dwMilliseconds / time-o
5、ut interval);hHandle為等待的對(duì)象,也就是實(shí)現(xiàn)同步或者互斥的對(duì)象。該函數(shù)一執(zhí)行,相應(yīng)的信號(hào)量就減去1,如果信號(hào)量小于等于0,那么他一直在循環(huán)。5 實(shí)現(xiàn)信號(hào)量互斥和同步CreateSemaphore用于創(chuàng)建信號(hào)量,根據(jù)參數(shù)的不同可以利用它實(shí)現(xiàn)互斥和同步。ReleaseSemaphore用于釋放信號(hào)量,使用后相應(yīng)的信號(hào)量加1HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,/SDLONG,lInitialCount,/initial countLONG,lMaximumCount,/maximum
6、 countLPCTSTR lpName/object name);ReleaseSemaphore(HANDLE hSemaphore, /handle to semaphoreLONG lRelseaseCount,/cont increment amountLPLONG lpPreviousCount/previous count);三、題目分析將所有的讀者和所有的寫者分別放進(jìn)兩個(gè)等待隊(duì)列中,當(dāng)讀允許時(shí)就讓讀者隊(duì)列釋放一個(gè)或多個(gè)讀者,當(dāng)寫允許時(shí),釋放第一個(gè)寫者操作。(1)構(gòu)筑讀者進(jìn)程和寫者進(jìn)程間的臨界區(qū)題目中說(shuō)的一批數(shù)據(jù)被多個(gè)讀者、寫者共享使用,允許多個(gè)讀者同時(shí)訪問(wèn)這些數(shù)據(jù),但是如果有一
7、個(gè)寫者在訪問(wèn)數(shù)據(jù)時(shí),就不允許其他讀者或?qū)懻呤褂茫?,?duì)這一批數(shù)據(jù)既要保證讀者和寫者互斥使用,也要保證寫者與寫者互斥使用。也就是說(shuō),在讀者進(jìn)程程序中,使用數(shù)據(jù)的程序段應(yīng)該構(gòu)成臨界區(qū);在寫者進(jìn)程程序中,使用數(shù)據(jù)的程序段應(yīng)該構(gòu)成臨界區(qū)。(2)判定是否是第一個(gè)讀者根據(jù)上面的分析,希望在讀者進(jìn)程中有一個(gè)辦法能判定請(qǐng)求進(jìn)入臨界區(qū)的是否是第一個(gè)讀者。如果是第一個(gè)讀者,就對(duì)信號(hào)量wsem做P操作,以取得和寫者的同步。為此,設(shè)置一個(gè)變量rfirst,初值為0.任何一個(gè)讀者運(yùn)行時(shí),都現(xiàn)在rfirst上加1,然后判定他是否取值為1.如果是1,則做P(wrt),否則不做。(3)判定是否是第一個(gè)寫者原理同(2)判定是
8、否為第一個(gè)讀者。(4)寫者優(yōu)先問(wèn)題的解決需要用到的如下的信號(hào)量和變量rsem: 初值為1的互斥信號(hào)量,在至少有一個(gè)寫者準(zhǔn)備訪問(wèn)數(shù)據(jù)時(shí)就不允許隨后來(lái)的讀者訪問(wèn)數(shù)據(jù)wserm: 初值為1的互斥信號(hào)量,之后有一個(gè)寫者訪問(wèn)數(shù)據(jù)時(shí)其他寫者和讀者就被阻止對(duì)數(shù)據(jù)的訪問(wèn)ReadMutex: 創(chuàng)建寫者的互斥信號(hào)量,初值為1WriteMutex: 創(chuàng)建讀者的互斥信號(hào)量,初值為1z: 初值為1的互斥信號(hào)量,在至少有一個(gè)寫著準(zhǔn)備訪問(wèn)數(shù)據(jù)、且后面已經(jīng)來(lái)一個(gè)讀者時(shí)再來(lái)的讀者將在這個(gè)信號(hào)量上等待rifrrst:讀者計(jì)數(shù)變量,初值為0wfirst:寫者計(jì)數(shù)變量,初值為0寫者優(yōu)先的PV原語(yǔ):reader(i):P(z);P(r
9、sem);P(ReadMutex);rfirst=rfirst+1;if(rfirst=1)P(wsem);V(ReadMutex);V(rsem);V(z);讀取所需數(shù)據(jù);P(ReadMutex);rfirst=rfirst-1;if(rfirst=0)V(wsem);V(ReadMutex);Writer():P(WriteMutex);wfirst=wfirst+1;if(wfirst=1)P(rsem);V(WritedMutex);P(wsem);改寫所需數(shù)據(jù);V(wsem);P(WriteMutex);wfirst=wfirst-1;if(wfirst=0)V(rsem);V(Wr
10、iteMutex);讀者 寫者圖3.1讀者-寫者的完整流程框圖(5)讀者優(yōu)先與寫者優(yōu)先算法相反,有一個(gè)讀者優(yōu)先的算法,即只要有讀者在讀數(shù)據(jù),寫者被拒絕在臨界區(qū)外面,如果有源源不斷的寫者來(lái),但是只要寫者不是第一個(gè),那么寫者將會(huì)永遠(yuǎn)被拒絕在臨界區(qū)外面。wrt::初值為1的互斥信號(hào)量,只要有一個(gè)寫者訪問(wèn)數(shù)據(jù), 則其他寫者和讀者就要被阻止對(duì)數(shù)據(jù)的訪問(wèn)。mutex:保證讀者互斥操作first的信號(hào)量,初值為1first :讀者計(jì)數(shù)變量,初值為0讀者優(yōu)先的PV原語(yǔ):write():P(wrt);對(duì)數(shù)據(jù)進(jìn)行修改;V(wrt);read():P(mutex);first = first+1;if(first
11、= 1)P(wrt);V(mutex);讀取所需數(shù)據(jù)P(mutex);first = first+1;if(first = 0)V(wrt);V(mutex);四、概要設(shè)計(jì)(1)控制流程用CheckPersonList(PersonLists)函數(shù)檢查PersonLists中是否有為創(chuàng)建的進(jìn)程(讀寫者)。如果有則創(chuàng)建相應(yīng)的讀寫線程(2)創(chuàng)建讀寫者用bool CreateReader(int StartTime,int WorkTime)函數(shù)創(chuàng)建讀者寫者相應(yīng)的線程,其中由windows提供的函數(shù)為CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&
12、dwThreadID);返回的是DWORD型變量。在CreateReader(int StartTime,int WorkTime)中還會(huì)初始化相應(yīng)的讀寫者的基本信息,例如何時(shí)申請(qǐng)數(shù)據(jù)何時(shí)讀數(shù)據(jù)何時(shí)關(guān)閉線程等等。(3)讀寫者進(jìn)程參見圖2.1讀者-寫者的完整流程圖。(4)同步與互斥WaitForSingleObject(信號(hào)量名字,infinite)和ReleaseSemaphore(信號(hào)量名字,1,null)用于實(shí)現(xiàn)同步于互斥,執(zhí)行WaitForSingleObject(信號(hào)量名字,infinite)信號(hào)量相應(yīng)的信號(hào)量減1,執(zhí)行ReleaseSemaphore(信號(hào)量名字,1,null)恢復(fù)1
13、。五、代碼及流程/寫者優(yōu)先算法#include #include #include #include #include #include #define MAX_PERSON 10#define READER 0#define WRITER 1#define END -1#define R READER#define W WRITER typedef struct _PersonHANDLE Thread;int Type;int StartTime;int WorkTime;int ID;Person; Person PersonsMAX_PERSON;int NumPerson = 0;l
14、ong CurrentTime= 0; int PersonLists = 1,R,1,3,2,W,2,5,/*讀寫互斥*/3,W,5,5,/*寫寫互斥*/4,R,3,5,/*寫讀互斥*/5,R,15,2,/*讀讀不互斥*/END,; int rfirst = 0;int wfirst = 0;int NumOfReaders = 0;int NumOfWriters = 0;HANDLE rsem;/*初值為1的互斥信號(hào)量,在至少有一個(gè)寫者準(zhǔn)備訪問(wèn)數(shù)據(jù)時(shí)就不允許隨后來(lái)的讀者訪問(wèn)數(shù)據(jù)*/HANDLE wsem;/*初值為1的互斥信號(hào)量,之后有一個(gè)寫者訪問(wèn)數(shù)據(jù)時(shí)其他寫者和讀者就被阻止對(duì)數(shù)據(jù)的訪問(wèn)
15、*/HANDLE z;/*初值為1的互斥信號(hào)量,在至少有一個(gè)寫著準(zhǔn)備訪問(wèn)數(shù)據(jù)、且后面已經(jīng)來(lái)一個(gè)讀者時(shí)再來(lái)的讀者將在這個(gè)信號(hào)量上等待*/HANDLE ReadMutex;/*創(chuàng)建寫者的互斥信號(hào)量,初值為1*/HANDLE WriteMutex;/*創(chuàng)建讀者的互斥信號(hào)量, 初值為1*/ void CheckPersonList(int *pPersonList);/*查看人數(shù),為創(chuàng)建讀寫者線程*/bool CreateReader(int StartTime,int WorkTime);bool CreateWriter(int StartTime,int WorkTime);DWORD WINA
16、PI ReaderProc(LPVOID lpParam);/*讀者進(jìn)程程序*/DWORD WINAPI WriterProc(LPVOID lpParam);/*寫著進(jìn)程程序*/#include Writerprior.hint main()rsem= CreateSemaphore(NULL,1,1,NULL);wsem= CreateSemaphore(NULL,1,1,NULL);z= CreateSemaphore(NULL,1,1,NULL); ReadMutex= CreateSemaphore(NULL,1,1,NULL); WriteMutex= CreateSemaphor
17、e(NULL,1,1,NULL);CurrentTime = 0;while(true)/模擬20個(gè)時(shí)鐘周期CheckPersonList(PersonLists);CurrentTime+;Sleep(600);printf(當(dāng)前時(shí)間 = %d:n,CurrentTime);if(CurrentTime=20)break;system(pause);CloseHandle(rsem);CloseHandle(wsem);CloseHandle(z);CloseHandle(ReadMutex);CloseHandle(WriteMutex);return 0; void CheckPerso
18、nList(int *pPersonLists)int i=0;int *pList = pPersonLists;bool P;while(pList0 != END)if(pList2 = CurrentTime)switch(pList1)case R:P = CreateReader(pList2,pList3);/創(chuàng)建一個(gè)讀者break;case W:P = CreateWriter(pList2,pList3);/創(chuàng)建一個(gè)寫者break;if(!P)printf(Create Person %d is wrongn,pList0);pList += 4; / 數(shù)組的指針指向第二個(gè)人
19、 DWORD WINAPI ReaderProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;pPerson-ID = +NumOfReaders;WaitForSingleObject(z,INFINITE);/P(z),其余讀者在此排隊(duì)printf(tt讀者 %d 申請(qǐng)讀數(shù)據(jù).n,pPerson-ID);WaitForSingleObject(rsem,INFINITE);/P(rsem),一個(gè)讀者與一個(gè)寫著再次競(jìng)爭(zhēng)數(shù)據(jù)的使用權(quán)/printf(Reader %d is requesting the Shared Buffer.n,pP
20、erson-ID); WaitForSingleObject(ReadMutex,INFINITE);/P(ReadMutex),讀者請(qǐng)求進(jìn)入rfirst臨界區(qū)rfirst+; if(rfirst = 1)/是否是第一個(gè)讀者 WaitForSingleObject(wsem,INFINITE);/讀者在此處與寫者進(jìn)行同步 ReleaseSemaphore(ReadMutex,1,NULL);/退出rfirst臨界區(qū),V(ReadMutex)ReleaseSemaphore(rsem,1,NULL);ReleaseSemaphore(z,1,NULL);/V(z)/ 讀取所需數(shù)據(jù),將現(xiàn)在時(shí)間賦值
21、給讀者,用以計(jì)算結(jié)束時(shí)間printf(tt讀者 %d 申請(qǐng)成功n,pPerson-ID);pPerson-StartTime = CurrentTime; printf(tt讀者 %d 正在讀數(shù)據(jù).n,pPerson-ID);while(CurrentTime StartTime + pPerson-WorkTime)/ 模擬讀數(shù)據(jù)printf(tt讀者 %d 讀完數(shù)據(jù)退出n,pPerson-ID);WaitForSingleObject(ReadMutex,INFINITE); rfirst-; if(rfirst = 0) /是最后一個(gè)讀者? ReleaseSemaphore(wsem,1
22、,NULL);/沒有讀者了,寫者放行 ReleaseSemaphore(ReadMutex,1,NULL);/退出讀者臨界區(qū) ExitThread(0);/關(guān)閉讀者線程return 0; DWORD WINAPI WriterProc(LPVOID lpParam)/寫者進(jìn)程程序Person *pPerson = (Person*)lpParam;pPerson-ID = +NumOfWriters; printf(tt寫者 %d 正在申請(qǐng)寫數(shù)據(jù).n,pPerson-ID); WaitForSingleObject(WriteMutex,INFINITE);/請(qǐng)求進(jìn)入寫者臨界區(qū)wfirst=w
23、first+;if(wfirst=1)WaitForSingleObject(rsem,INFINITE);/一個(gè)寫者在此與讀者取得同步ReleaseSemaphore(WriteMutex,1,NULL);/退出rfirst臨界區(qū)WaitForSingleObject(wsem,INFINITE);/其他寫者在此等候進(jìn)入寫臨界區(qū) / 讀取所需數(shù)據(jù),將現(xiàn)在時(shí)間賦值給讀者,用以計(jì)算結(jié)束時(shí)間pPerson-StartTime = CurrentTime; printf(tt寫者 %d 正在寫數(shù)據(jù).n,pPerson-ID);while(CurrentTime StartTime + pPerson
24、-WorkTime)/模擬寫數(shù)據(jù)printf(tt寫者 %d 寫完數(shù)據(jù)退出n,pPerson-ID);ReleaseSemaphore(wsem,1,NULL);/退出進(jìn)入寫臨界區(qū)WaitForSingleObject(WriteMutex,INFINITE);/請(qǐng)求進(jìn)入wfirst臨界區(qū)wfirst=wfirst-;if(wfirst=0)/是最后一個(gè)寫者?ReleaseSemaphore(rsem,1,NULL);/沒有寫者了,向讀者放行ReleaseSemaphore(WriteMutex,1,NULL);/退出wfirst臨界區(qū)ExitThread(0);/關(guān)閉寫者線程return 0
25、; bool CreateReader(int StartTime,int WorkTime)DWORD dwThreadID;Person *pPerson = &PersonsNumPerson;pPerson-StartTime= StartTime;pPerson-WorkTime= WorkTime;pPerson-Type= READER; NumPerson+; / 創(chuàng)建一個(gè)讀者的新線程pPerson-Thread = CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);if(pPerson-Thread =
26、 NULL) return false; return true; bool CreateWriter(int StartTime,int WorkTime)DWORD dwThreadID;if(NumPerson = MAX_PERSON)return false;Person *pPerson = &PersonsNumPerson;pPerson-StartTime = StartTime;pPerson-WorkTime = WorkTime;pPerson-Type = WRITER; NumPerson+; / 創(chuàng)建一個(gè)寫者的新線程pPerson-Thread = CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThread
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位管理制度分享大全人事管理篇十篇
- 單位管理制度呈現(xiàn)大合集人事管理十篇
- 《行政職業(yè)能力測(cè)驗(yàn)》山西省呂梁地區(qū)嵐縣2024年公務(wù)員考試全真模擬試卷含解析
- 《喜迎中秋模板》課件
- 新餐飲浪潮的魅力
- 重癥監(jiān)護(hù)室護(hù)士工作總結(jié)
- 婦科護(hù)士的工作心得
- 2023年-2024年項(xiàng)目部安全管理人員安全培訓(xùn)考試題及答案基礎(chǔ)題
- 2023-2024年項(xiàng)目管理人員安全培訓(xùn)考試題答案典型題匯編
- 2023年-2024年新員工入職安全教育培訓(xùn)試題含答案【突破訓(xùn)練】
- 食品安全應(yīng)急管理和突發(fā)事故報(bào)告制度
- 藝術(shù)學(xué)概論第一章-彭吉象
- 51job在線測(cè)評(píng)題集
- 2024新教科版一年級(jí)科學(xué)上冊(cè)全冊(cè)教案
- 2024兒童身高現(xiàn)狀報(bào)告
- 趣味知識(shí)問(wèn)答100道
- 紫砂壺介紹課件
- 2023年度學(xué)校食堂食品從業(yè)人員考核試題(附答案)
- 伊朗政府與政治課件
- 上交所金橋數(shù)據(jù)中心用戶手冊(cè)
- 互聯(lián)網(wǎng)金融(同濟(jì)大學(xué))智慧樹知到期末考試答案章節(jié)答案2024年同濟(jì)大學(xué)
評(píng)論
0/150
提交評(píng)論