版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 計(jì)算機(jī)與信息學(xué)院</b></p><p> 操作系統(tǒng)課程設(shè)計(jì)報(bào)告</p><p><b> 開(kāi)題報(bào)告</b></p><p> 該項(xiàng)課程設(shè)計(jì)的意義;</p><p> 更加深入的了解讀者寫(xiě)者問(wèn)題的算法;</p><p> 加深對(duì)線程,進(jìn)
2、程的理解;</p><p> 加深對(duì)“線程同步”概念的理解,理解并應(yīng)用“信號(hào)量機(jī)制”;</p><p> 熟悉計(jì)算機(jī)對(duì)處理機(jī)的管理,了解臨界資源的訪問(wèn)方式;</p><p> 了解C++中線程的實(shí)現(xiàn)方式,研讀API。</p><p><b> 課程設(shè)計(jì)的任務(wù)</b></p><p> 多
3、進(jìn)程/線程編程:讀者-寫(xiě)者問(wèn)題。 </p><p> 設(shè)置兩類(lèi)進(jìn)程/線程,一類(lèi)為讀者,一類(lèi)為寫(xiě)者;</p><p> 隨機(jī)啟動(dòng)讀者或?qū)懻撸?lt;/p><p> 顯示讀者或?qū)懻邎?zhí)行狀態(tài);</p><p> 隨著進(jìn)程/線程的執(zhí)行,更新顯示;</p><p> 相關(guān)原理及
4、算法描述;</p><p><b> 整體概況:</b></p><p> 該程序從大體上來(lái)分只有兩個(gè)模塊,即“讀者優(yōu)先”和“寫(xiě)者優(yōu)先”模塊.</p><p><b> 讀者優(yōu)先:</b></p><p> 如果沒(méi)有寫(xiě)者正在操作,則讀者不需要等待,用一個(gè)整型變量readcount記錄讀者數(shù)目
5、,用于確定是否釋放讀者線程,readcount的初值為0.當(dāng)線程開(kāi)始調(diào)入時(shí).每個(gè)讀者準(zhǔn)備讀. 等待互斥信號(hào),保證對(duì)readcount 的訪問(wèn),修改互斥.即readcount++.而當(dāng)讀者線程進(jìn)行讀操作時(shí),則讀者數(shù)目減少(readcount--).當(dāng)readcout=0 時(shí),說(shuō)明所有的讀者都已經(jīng)讀完,離開(kāi)臨界區(qū)喚醒寫(xiě)者(LeaveCriticalSection(&RP_Write);), 釋放互斥信號(hào)(ReleaseMutex(h
6、_Mutex)).</p><p> 還需要一個(gè)互斥對(duì)象mutex來(lái)實(shí)現(xiàn)對(duì)全局變量Read_count修改時(shí)的互斥. 另外,為了實(shí)現(xiàn)寫(xiě)-寫(xiě)互斥,需要增加一個(gè)臨界區(qū)對(duì)象Write。當(dāng)寫(xiě)者發(fā)出寫(xiě)請(qǐng)求時(shí),必須申請(qǐng)臨界區(qū)對(duì)象的所有權(quán)。通過(guò)這種方法,可以實(shí)現(xiàn)讀-寫(xiě)互斥,當(dāng)Read_count=1時(shí)(即第一個(gè)讀者到來(lái)時(shí)),讀者線程也必須申請(qǐng)臨界區(qū)對(duì)象的所有權(quán)</p><p><b> 寫(xiě)
7、者優(yōu)先:</b></p><p> 寫(xiě)者優(yōu)先與讀者不同之處在于一旦一個(gè)寫(xiě)者到來(lái),它應(yīng)該盡快對(duì)文件進(jìn)行寫(xiě)操作,如果有一個(gè)寫(xiě)者在等待,則新到來(lái)的讀者不允許進(jìn)行讀操作。為此應(yīng)當(dāng)填加一個(gè)整形變量write_count,用于記錄正在等待的寫(xiě)者的數(shù)目,write_count的初值為0.當(dāng)線程開(kāi)始調(diào)入時(shí).只允許一個(gè)寫(xiě)者準(zhǔn)備讀. 等待互斥信號(hào),保證對(duì)write_count 的訪問(wèn),修改互斥.即write_count
8、++.而當(dāng)寫(xiě)者線程進(jìn)行讀操作時(shí),則相應(yīng)寫(xiě)者數(shù)目減少(write_count--).當(dāng)write_count=0 時(shí),說(shuō)明所有的讀者都已經(jīng)讀完,離開(kāi)臨界區(qū)喚醒讀者,釋放互斥信號(hào).</p><p> 為了實(shí)現(xiàn)寫(xiě)者優(yōu)先,應(yīng)當(dāng)填加一個(gè)臨界區(qū)對(duì)象read,當(dāng)有寫(xiě)者在寫(xiě)文件或等待時(shí),讀者必須阻塞在read上。</p><p><b> 開(kāi)發(fā)環(huán)境;</b></p>
9、<p><b> VC++6.0</b></p><p><b> 預(yù)期設(shè)計(jì)目標(biāo);</b></p><p> 讀者-寫(xiě)者問(wèn)題的讀寫(xiě)操作限制(包括讀者優(yōu)先和寫(xiě)者優(yōu)先)</p><p> 1.寫(xiě)-寫(xiě)互斥:不能有兩個(gè)寫(xiě)者同時(shí)進(jìn)行寫(xiě)操作</p><p> 2.讀-寫(xiě)互斥:不能同時(shí)有一個(gè)
10、線程在讀,而另一個(gè)線程在寫(xiě)。</p><p> 3.讀-讀允許:可以有一個(gè)或多個(gè)讀者在讀。</p><p> 若讀者的優(yōu)先權(quán)比寫(xiě)者高, 如果讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一個(gè)讀者正在進(jìn)行讀操作,則該讀者可直接開(kāi)始讀操作.不必經(jīng)過(guò)別的操件</p><p> 若讀者的優(yōu)先權(quán)比寫(xiě)者高,如果第一個(gè)寫(xiě)者已經(jīng)占有了文件的時(shí)候.則別的讀者必需等待該操作完成后.才能開(kāi)始讀操作.&
11、lt;/p><p> 若寫(xiě)者的優(yōu)先權(quán)比讀者高, 在一個(gè)寫(xiě)者提出要訪問(wèn)文件時(shí),就必須使其盡可能的得到文件,而且不用調(diào)配。</p><p> 完成課程設(shè)計(jì)的任務(wù),實(shí)現(xiàn)讀者寫(xiě)者問(wèn)題的全部要求,同時(shí)可以實(shí)現(xiàn)“讀者優(yōu)先”和“寫(xiě)者優(yōu)先”兩種情況,有時(shí)間的話,爭(zhēng)取實(shí)現(xiàn)可視化圖形界面。</p><p><b> 課程設(shè)計(jì)報(bào)告</b></p>&
12、lt;p> 課程設(shè)計(jì)任務(wù)、要求、目的;</p><p><b> 任務(wù)和要求:</b></p><p> 多進(jìn)程/線程編程:讀者-寫(xiě)者問(wèn)題。 </p><p> 設(shè)置兩類(lèi)進(jìn)程/線程,一類(lèi)為讀者,一類(lèi)為寫(xiě)者;</p><p> 隨機(jī)啟動(dòng)讀者或?qū)懻撸?lt;/p&
13、gt;<p> 顯示讀者或?qū)懻邎?zhí)行狀態(tài);</p><p> 隨著進(jìn)程/線程的執(zhí)行,更新顯示;</p><p><b> 目的:</b></p><p> 1 更加深入的了解讀者寫(xiě)者問(wèn)題的算法;</p><p> 2 加深對(duì)線程,進(jìn)程的理解;</p><p> 3 加深對(duì)“
14、線程同步”概念的理解,理解并應(yīng)用“信號(hào)量機(jī)制”;</p><p> 4 熟悉計(jì)算機(jī)對(duì)處理機(jī)的管理,了解臨界資源的訪問(wèn)方式;</p><p> 5 了解C++中線程的實(shí)現(xiàn)方式,研讀API。</p><p><b> 原理及算法描述;</b></p><p><b> 寫(xiě)者優(yōu)先原理圖:</b>&
15、lt;/p><p><b> 讀者優(yōu)先原理圖:</b></p><p><b> 算法描述:</b></p><p> 讀者優(yōu)先的附加限制:如果讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一個(gè)讀者正在進(jìn)行讀操作,則該讀者可直接開(kāi)始讀操作。</p><p> 寫(xiě)者優(yōu)先的附加限制:如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一
16、個(gè)寫(xiě)者在等待訪問(wèn)共享資源,則該讀者必須等到?jīng)]有寫(xiě)者處于等待狀態(tài)后才能開(kāi)始讀操作。</p><p><b> 開(kāi)發(fā)環(huán)境;</b></p><p><b> VC++6.0</b></p><p> 重要算法和設(shè)計(jì)思路描述;</p><p><b> 整體概況:</b>&l
17、t;/p><p> 該程序從大體上來(lái)分只有兩個(gè)模塊,即“讀者優(yōu)先”和“寫(xiě)者優(yōu)先”模塊.</p><p><b> 讀者優(yōu)先:</b></p><p> 如果沒(méi)有寫(xiě)者正在操作,則讀者不需要等待,用一個(gè)整型變量readcount記錄讀者數(shù)目,用于確定是否釋放讀者線程,readcount的初值為0.當(dāng)線程開(kāi)始調(diào)入時(shí).每個(gè)讀者準(zhǔn)備讀. 等待互斥信號(hào),
18、保證對(duì)readcount 的訪問(wèn),修改互斥.即readcount++.而當(dāng)讀者線程進(jìn)行讀操作時(shí),則讀者數(shù)目減少(readcount--).當(dāng)readcout=0 時(shí),說(shuō)明所有的讀者都已經(jīng)讀完,離開(kāi)臨界區(qū)喚醒寫(xiě)者(LeaveCriticalSection(&RP_Write);), 釋放互斥信號(hào)(ReleaseMutex(h_Mutex)).</p><p> 還需要一個(gè)互斥對(duì)象mutex來(lái)實(shí)現(xiàn)對(duì)全局變量
19、Read_count修改時(shí)的互斥. 另外,為了實(shí)現(xiàn)寫(xiě)-寫(xiě)互斥,需要增加一個(gè)臨界區(qū)對(duì)象Write。當(dāng)寫(xiě)者發(fā)出寫(xiě)請(qǐng)求時(shí),必須申請(qǐng)臨界區(qū)對(duì)象的所有權(quán)。通過(guò)這種方法,可以實(shí)現(xiàn)讀-寫(xiě)互斥,當(dāng)Read_count=1時(shí)(即第一個(gè)讀者到來(lái)時(shí)),讀者線程也必須申請(qǐng)臨界區(qū)對(duì)象的所有權(quán)</p><p><b> 寫(xiě)者優(yōu)先:</b></p><p> 寫(xiě)者優(yōu)先與讀者不同之處在于一旦一個(gè)
20、寫(xiě)者到來(lái),它應(yīng)該盡快對(duì)文件進(jìn)行寫(xiě)操作,如果有一個(gè)寫(xiě)者在等待,則新到來(lái)的讀者不允許進(jìn)行讀操作。為此應(yīng)當(dāng)填加一個(gè)整形變量write_count,用于記錄正在等待的寫(xiě)者的數(shù)目,write_count的初值為0.當(dāng)線程開(kāi)始調(diào)入時(shí).只允許一個(gè)寫(xiě)者準(zhǔn)備讀. 等待互斥信號(hào),保證對(duì)write_count 的訪問(wèn),修改互斥.即write_count++.而當(dāng)寫(xiě)者線程進(jìn)行讀操作時(shí),則相應(yīng)寫(xiě)者數(shù)目減少(write_count--).當(dāng)write_count=
21、0 時(shí),說(shuō)明所有的讀者都已經(jīng)讀完,離開(kāi)臨界區(qū)喚醒讀者,釋放互斥信號(hào).</p><p> 為了實(shí)現(xiàn)寫(xiě)者優(yōu)先,應(yīng)當(dāng)填加一個(gè)臨界區(qū)對(duì)象read,當(dāng)有寫(xiě)者在寫(xiě)文件或等待時(shí),讀者必須阻塞在read上。</p><p> 程序?qū)崿F(xiàn)---數(shù)據(jù)結(jié)構(gòu);</p><p> 相關(guān)WindowsAPI說(shuō)明:</p><p> CreateThread: 創(chuàng)建
22、一個(gè)在調(diào)用進(jìn)程的地址空間中執(zhí)行的線程。</p><p> ExitThread </p><p> Sleep: 對(duì)指定的時(shí)間間隔掛起當(dāng)前的執(zhí)行線程</p><p> CreateMutex: 創(chuàng)建有名或者無(wú)名的互斥對(duì)象</p><p> ReleaseMutex:</p><p> WaitForSingl
23、eObject: 當(dāng)發(fā)生(1)指定對(duì)象處于信號(hào)態(tài)(2)超時(shí) 則該函數(shù)返回</p><p> WaitForMultipleObject: 任意一個(gè)或全部指定對(duì)象處于信號(hào)態(tài)或超時(shí)間隔已過(guò)時(shí),返回</p><p> CreateSemapore: 創(chuàng)建一個(gè)有名或無(wú)名信號(hào)對(duì)象。</p><p> ReleaseSemapore: </p><p&
24、gt; InitializeCriticalSection: 初始化臨界區(qū)對(duì)象</p><p> EnterCriticalSection: 等待指定臨界區(qū)對(duì)象的所有權(quán)。當(dāng)調(diào)用線程被賦予所有權(quán)時(shí),返回。</p><p> LeaveCriticalSection:該函數(shù)釋放指定臨界區(qū)對(duì)象的所有權(quán)。</p><p> 程序?qū)崿F(xiàn)---程序清單;</p>
25、;<p> #include <windows.h></p><p> //#include <ctype.h></p><p> //#include <stdio.h></p><p> //#include <string.h></p><p> //#includ
26、e <stdlib.h></p><p> //#include <malloc.h></p><p> #include<iostream></p><p> using namespace std;</p><p> #define MAX_PERSON 100 //最多100人<
27、/p><p> #define READER 0 //讀者</p><p> #define WRITER 1 //寫(xiě)者</p><p> #define END -1 //結(jié)束</p><p> //#define R READER</p><p&
28、gt; //#define W WRITER</p><p> typedef struct </p><p><b> {</b></p><p> HANDLE m_hThread;//定義處理線程的句柄</p><p> int Type;//進(jìn)程類(lèi)型(讀寫(xiě))</p&g
29、t;<p> int StartTime;//開(kāi)始時(shí)間</p><p> int WorkTime;//運(yùn)行時(shí)間</p><p> int ID;//進(jìn)程號(hào)</p><p><b> }Person;</b></p><p> Person Persons[MAX_PERSON]
30、;</p><p> int NumOfPerson = 0;</p><p> long CurrentTime= 0;//基本時(shí)間片數(shù)</p><p> int PersonLists[] = {//進(jìn)程隊(duì)列</p><p> 1, WRITER, 3, 5,</p><p> 2, WRIT
31、ER, 16, 5,</p><p> 3, READER, 2, 2,</p><p> 4, WRITER, 6, 5,</p><p> 5, READER, 4, 3,</p><p> 6, READER, 17,7,</p><p><b> END,</b></p&g
32、t;<p><b> };</b></p><p> int NumOfReading = 0;</p><p> int NumOfWriteRequest = 0;//申請(qǐng)寫(xiě)進(jìn)程的個(gè)數(shù)</p><p> HANDLE ReadSemaphore;//讀者信號(hào)</p><p> HA
33、NDLE WriteSemaphore;//寫(xiě)者信號(hào)</p><p> bool finished = false; //所有的讀完成</p><p> //bool wfinished = false; //所有的寫(xiě)完成</p><p> void CreatePersonList(int *pPersonList);</p><p&g
34、t; bool CreateReader(int StartTime,int WorkTime,int ID);</p><p> bool CreateWriter(int StartTime,int WorkTime,int ID);</p><p> DWORD WINAPI ReaderProc(LPVOID lpParam);</p><p>
35、 DWORD WINAPI WriterProc(LPVOID lpParam);</p><p> int main()</p><p><b> {</b></p><p> ReadSemaphore = CreateSemaphore(NULL,1,100,NULL); </p><p> //創(chuàng)建
36、信號(hào)量,當(dāng)前可用的資源數(shù)為1,最大為100</p><p> /*HANDLE CreateSemaphore(</p><p> LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //lpSemaphoreAttributes為安全屬性</p><p> LONG lInitialCount,
37、 //lInitialCount為Semaphore的初始值</p><p> LONG lMaximumCount, //lMaximumCount為最大值</p><p> LPCTSTR lpName //lpName為Se
38、maphore對(duì)象的名字,NULL表示創(chuàng)建匿名Semaphore</p><p><b> );*/</b></p><p> WriteSemaphore = CreateSemaphore(NULL,1,100,NULL); //創(chuàng)建信號(hào)量,當(dāng)前可用的資源數(shù)為1,最大為100</p><p> CreatePersonList(Per
39、sonLists); // 創(chuàng)建所有讀者寫(xiě)者</p><p> cout<<"創(chuàng)建所有的讀者寫(xiě)者"<<"\n...\n";</p><p> CurrentTime = 0;</p><p> while(true)</p><p><b> {</b&g
40、t;</p><p> CurrentTime++;</p><p> Sleep(300); // 300 ms</p><p> cout<<"當(dāng)前時(shí)間 = "<<CurrentTime<<endl;</p><p> if(finished) return 0;</p
41、><p><b> }</b></p><p> // return 0;</p><p><b> }</b></p><p> void CreatePersonList(int *pPersonLists)</p><p><b> {</b>
42、;</p><p><b> int i=0;</b></p><p> int *pList = pPersonLists;</p><p><b> bool Ret;</b></p><p> while(pList[0] != END)</p><p>&
43、lt;b> {</b></p><p> switch(pList[1])</p><p><b> {</b></p><p> case READER:</p><p> Ret = CreateReader(pList[2],pList[3],pList[0]);</p>
44、<p><b> break;</b></p><p> case WRITER:</p><p> Ret = CreateWriter(pList[2],pList[3],pList[0]);</p><p><b> break;</b></p><p><b>
45、 }</b></p><p><b> if(!Ret)</b></p><p> printf("Create Person %d is wrong\n",pList[0]);</p><p> pList += 4; // 尋找下一個(gè)讀者或者寫(xiě)者 </p><p><b&g
46、t; }</b></p><p><b> }</b></p><p> bool CreateReader(int StartTime,int WorkTime,int ID)</p><p><b> {</b></p><p> DWORD dwThreadID;<
47、/p><p> if(NumOfPerson >= MAX_PERSON)</p><p> return false;</p><p> Person *pPerson = &Persons[NumOfPerson];</p><p> pPerson->ID = ID;</p><p>
48、pPerson->StartTime = StartTime;</p><p> pPerson->WorkTime = WorkTime;</p><p> pPerson->Type = READER;</p><p> NumOfPerson++;</p><p><b> // 新建進(jìn)程</b
49、></p><p> pPerson->m_hThread= CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID); </p><p> /*HANDLE CreateThread(</p><p> LPSECURITY_ATTRIBUTES lpThreadAttri
50、butes, // pointer to security attributes 安全屬性</p><p> DWORD dwStackSize, // initial thread stack size 堆棧大小</p><p> LPTHREAD_START_ROUTINE lpStartAddress, //
51、 pointer to thread function 函數(shù)指針</p><p> LPVOID lpParameter, // argument for new thread</p><p> DWORD dwCreationFlags, // creation flags</p&
52、gt;<p> LPDWORD lpThreadId // pointer to receive thread ID</p><p><b> );*/</b></p><p> if(pPerson->m_hThread == NULL)</p><p> retur
53、n false;</p><p> return true;</p><p><b> }</b></p><p> bool CreateWriter(int StartTime,int WorkTime,int ID)</p><p><b> { </b></p><
54、;p> DWORD dwThreadID;</p><p> if(NumOfPerson >= MAX_PERSON) </p><p> return false;</p><p> Person *pPerson = &Persons[NumOfPerson];</p><p> pPerson->
55、;ID = ID;</p><p> pPerson->StartTime = StartTime;</p><p> pPerson->WorkTime = WorkTime;</p><p> pPerson->Type = WRITER;</p><p> NumOfPerson++;</p>
56、<p><b> // 新建進(jìn)程</b></p><p> pPerson->m_hThread= CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID);</p><p> /*HANDLE CreateThread(</p><p> LP
57、SECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes 安全屬性</p><p> DWORD dwStackSize, // initial thread stack size 堆棧大小</p><p> LPTHREAD_STA
58、RT_ROUTINE lpStartAddress, // pointer to thread function 函數(shù)指針</p><p> LPVOID lpParameter, // argument for new thread</p><p> DWORD dwCreationFlags,
59、 // creation flags</p><p> LPDWORD lpThreadId // pointer to receive thread ID</p><p><b> );*/</b></p><p> if(pPerson->m_hThread ==
60、NULL)</p><p> return false;</p><p> return true;</p><p><b> }</b></p><p> DWORD WINAPI ReaderProc(LPVOID lpParam)//讀過(guò)程</p><p><b> {&
61、lt;/b></p><p> Person *pPerson = (Person *)lpParam;</p><p><b> // 等待啟動(dòng)時(shí)間</b></p><p> while(CurrentTime != pPerson->StartTime)</p><p><b> {&l
62、t;/b></p><p> //讀操作還沒(méi)有到達(dá)執(zhí)行時(shí)間,則等待</p><p><b> }</b></p><p> printf("Reader %d is Requesting ...\n",pPerson->ID);</p><p> printf("\n\n
63、************************************************\n");</p><p><b> //等待寫(xiě)者請(qǐng)求</b></p><p> //該語(yǔ)句在寫(xiě)者優(yōu)先的時(shí)候是認(rèn)為寫(xiě)者優(yōu)先級(jí)高于讀者,在有寫(xiě)者的時(shí)候讀者需要等候,而在讀者優(yōu)先的時(shí)候,不用判斷是否存在寫(xiě)者,有讀者時(shí)即開(kāi)始讀操作。</p><p
64、> while(NumOfWriteRequest != 0)</p><p><b> {</b></p><p> //NumOfWriteRequest != 0 表示有寫(xiě)者在等待,不能讀</p><p><b> }</b></p><p> //等待ReadSemaphor
65、e讀信號(hào),即當(dāng)ReadSemaphore有信號(hào)時(shí)等待結(jié)束,相當(dāng)于p操作</p><p> WaitForSingleObject(ReadSemaphore,INFINITE);</p><p> /*DWORD WaitForMultipleObjects(</p><p> CONST HANDLE *lpHandles, // pointer to t
66、he object-handle array</p><p> DWORD dwMilliseconds // time-out interval in milliseconds</p><p><b> );*/</b></p><p> if(NumOfReading == 0)</p><p>&l
67、t;b> {</b></p><p> //當(dāng)?shù)谝粋€(gè)讀者到了,如果WriteSemaphore信號(hào)燈滅了,說(shuō)明有寫(xiě)者在寫(xiě),讀者必須等待,即互斥寫(xiě)操作</p><p> WaitForSingleObject(WriteSemaphore,INFINITE); </p><p><b> }</b></p>
68、<p> NumOfReading++;</p><p> //還有讀者,但是允許下一個(gè)讀進(jìn)程讀取,相當(dāng)于V操作</p><p> ReleaseSemaphore(ReadSemaphore,1,NULL); </p><p> /*BOOL ReleaseSemaphore(</p><p> HANDLE hSe
69、maphore,//lpReleaseCount參數(shù)表示要增加的數(shù)值</p><p> LONG lReleaseCount, //lpPreviousCount參數(shù)用于返回之前的計(jì)算值,如果不需要可以設(shè)置為NULL </p><p> LPLONG lpPreviousCount</p><p><b> )
70、;*/</b></p><p><b> // 啟動(dòng)讀者</b></p><p> pPerson->StartTime = CurrentTime; </p><p> printf("Reader %d is Reading the Critical Section...\n",pPerson-&
71、gt;ID);</p><p> printf("\n\n************************************************\n"); </p><p> while(CurrentTime <= pPerson->StartTime + pPerson->WorkTime)</p><p>&
72、lt;b> {</b></p><p> // .. 執(zhí)行讀操作</p><p><b> }</b></p><p> printf("Reader %d is Exit...\n",pPerson->ID);</p><p> printf("\n\n
73、************************************************\n");</p><p> WaitForSingleObject(ReadSemaphore,INFINITE);</p><p> NumOfReading--;</p><p> if(NumOfReading == 0) </p>
74、<p><b> {</b></p><p> ReleaseSemaphore(WriteSemaphore,1,NULL);//此時(shí)沒(méi)有讀者,可以寫(xiě)</p><p><b> }</b></p><p> ReleaseSemaphore(ReadSemaphore,1,NULL);</p>
75、;<p> if(pPerson->ID == 6 ) finished = true; //所有的讀寫(xiě)完成</p><p> ExitThread(0);</p><p><b> return 0;</b></p><p><b> }</b></p><p> D
76、WORD WINAPI WriterProc(LPVOID lpParam)</p><p><b> {</b></p><p> Person *pPerson = (Person *)lpParam;</p><p><b> // 等待啟動(dòng)時(shí)間</b></p><p> while(
77、CurrentTime != pPerson->StartTime) </p><p><b> {</b></p><p><b> }</b></p><p> printf("Writer %d is Requesting ...\n",pPerson->ID);</p&g
78、t;<p> printf("\n\n************************************************\n"); </p><p> NumOfWriteRequest++;</p><p> //在寫(xiě)者優(yōu)先的時(shí)候需要用自加來(lái)初始信號(hào)值,而在讀者優(yōu)先的時(shí)是通過(guò)讀者操作來(lái)控制信號(hào)值</p><p>
79、; WaitForSingleObject(WriteSemaphore,INFINITE);</p><p><b> // 啟動(dòng)寫(xiě)者</b></p><p> pPerson->StartTime = CurrentTime; </p><p> printf("Writer %d is Writting the C
80、ritical Section...\n",pPerson->ID);</p><p> while(CurrentTime <= pPerson->StartTime + pPerson->WorkTime)</p><p><b> {</b></p><p> // .. 執(zhí)行寫(xiě)操作</p&
81、gt;<p><b> }</b></p><p> printf("Writer %d is Exit...\n",pPerson->ID);</p><p> printf("\n\n************************************************\n");</
82、p><p> NumOfWriteRequest--;</p><p> ReleaseSemaphore(WriteSemaphore,1,NULL);</p><p> if(pPerson->ID == 6 ) finished = true;//所有的讀寫(xiě)完成</p><p> ExitThread(0);</p>
83、;<p><b> return 0;</b></p><p><b> }</b></p><p><b> 總結(jié);</b></p><p> 本次的操作系統(tǒng)課程設(shè)計(jì),收獲還是很大的。讀者寫(xiě)者問(wèn)題是一個(gè)經(jīng)典的多線程的問(wèn)題,圖書(shū)館和網(wǎng)上都有很多資料,我也看了很多這方面的資料,應(yīng)該
84、說(shuō)這個(gè)課程設(shè)計(jì)為我更加深入的研究開(kāi)了一個(gè)很好的頭。</p><p> 驗(yàn)收的老師是路強(qiáng)老師,他當(dāng)時(shí)問(wèn)我怎么保證window下p,v操作的原子性,說(shuō)實(shí)在的,我一直研究的是我程序的算法和實(shí)現(xiàn),還真沒(méi)考慮過(guò)我用的底層API函數(shù)的具體特征這個(gè)問(wèn)題,我武斷的認(rèn)為windows底層已經(jīng)實(shí)現(xiàn)了原子性,他讓我回去再查資料,下次再驗(yàn)收,還跟我講了很多他的研究生研究的課題與p,v操作有關(guān),p,v操作的原子性至關(guān)重要。我查了很多資料
85、,還到csdn詢(xún)問(wèn)了一些技術(shù)牛,雖然windows的API沒(méi)有明確說(shuō)明WaitForSingleObject()(也就是windows的一種p操作)的原子性,但是在很多文獻(xiàn)和高手的博客中,證實(shí)了該函數(shù)的原子性。</p><p> 所以說(shuō)這次課程設(shè)計(jì)不僅鍛煉了我代碼實(shí)現(xiàn)的能力,也是開(kāi)拓了我的思路和想問(wèn)題的方向,以及對(duì)細(xì)節(jié)的注重,再次感謝我的指導(dǎo)老師們,他別是路強(qiáng)老師對(duì)我的啟發(fā)。</p><p&
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)-讀者寫(xiě)者問(wèn)題
- 操作系統(tǒng)課程設(shè)計(jì)——讀者寫(xiě)者問(wèn)題
- 操作系統(tǒng)課程設(shè)計(jì)---讀者-寫(xiě)者問(wèn)題實(shí)現(xiàn)
- 操作系統(tǒng)原理課程設(shè)計(jì)讀者-寫(xiě)者問(wèn)題的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)-- linux下讀者與寫(xiě)者的問(wèn)題實(shí)現(xiàn)
- 讀者與寫(xiě)者-操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 讀者寫(xiě)者問(wèn)題-操作系統(tǒng)實(shí)驗(yàn)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告-讀者寫(xiě)著問(wèn)題
- 北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫(xiě)者問(wèn)題
- 讀者寫(xiě)者課程設(shè)計(jì)
- 讀者與寫(xiě)者問(wèn)題課程設(shè)計(jì)報(bào)告
- 《操作系統(tǒng)》課程設(shè)計(jì)--基于信號(hào)量與pv操作同步機(jī)制的讀者寫(xiě)者問(wèn)題的設(shè)計(jì)與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)——生產(chǎn)者消費(fèi)者問(wèn)題
- 操作系統(tǒng)課程設(shè)計(jì)——生產(chǎn)者消費(fèi)者問(wèn)題
- 生產(chǎn)者消費(fèi)者問(wèn)題操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題
- 操作系統(tǒng)課程設(shè)計(jì)--蘋(píng)果問(wèn)題
- 操作系統(tǒng)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論