版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 操作系統(tǒng)課程設(shè)計報告</p><p> 一、操作系統(tǒng)課程設(shè)計任務(wù)書</p><p><b> 讀者-寫者問題實(shí)現(xiàn)</b></p><p><b> 設(shè)計目的</b></p><p> 通過實(shí)現(xiàn)經(jīng)典的讀者寫者問題,鞏固對線程及其同步機(jī)制的學(xué)習(xí)效果,加深對相關(guān)基本概念的理解
2、,并學(xué)習(xí)如何將基本原理和實(shí)際設(shè)計有機(jī)的結(jié)合。</p><p><b> 2 設(shè)計內(nèi)容</b></p><p> 在Windows 2000/XP環(huán)境下,使用多線程和信號量機(jī)制實(shí)現(xiàn)經(jīng)典的讀者寫者問題,每個線程代表一個讀者或一個寫者。</p><p> 每個線程按相應(yīng)測試數(shù)據(jù)文件的要求,進(jìn)行讀寫操作。請用信號量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先
3、的讀者-寫者問題。</p><p> 讀者-寫者問題的讀寫操作限制:</p><p> (1)寫-寫互斥,即不能有兩個寫者同時進(jìn)行寫操作</p><p> (2)讀-寫互斥,即不能同時有一個讀者在讀,同時卻有一個寫者在寫</p><p> (3)讀-讀允許,即可以有二個以上的讀者同時讀</p><p> 讀者
4、優(yōu)先的附加限制:如果一個讀者申請進(jìn)行讀操作時已有另一讀者正在進(jìn)行讀操作,則該讀者可直接開始讀操作。</p><p> 寫者優(yōu)先的附加限制:如果一個讀者申請進(jìn)行讀操作時已有另一寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。</p><p> 運(yùn)行結(jié)果顯示要求:要求在每個線程創(chuàng)建、發(fā)出讀寫操作申請、開始讀寫操作和結(jié)束讀寫操作時分別顯示一行提示信息,以確信所有
5、處理都遵守相應(yīng)的讀寫操作限制。</p><p> 3 測試數(shù)據(jù)文件格式</p><p> 測試數(shù)據(jù)文件包括n 行測試數(shù)據(jù),分別描述創(chuàng)建的n 個線程是讀者還是寫者,以及讀寫操作的開始時間和持續(xù)時間。每行測試數(shù)據(jù)包括四個字段,各字段間用空格分隔。第一字段為一個正整數(shù),表示線程序號。第二字段表示相應(yīng)線程角色,R 表示讀者是,W 表示寫者。第三字段為一個正數(shù),表示讀寫操作的開始時間。線程創(chuàng)建
6、后,延時相應(yīng)時間(單位為秒)后發(fā)出對共享資源的讀寫申請。第四字段為一個正數(shù),表示讀寫操作的持續(xù)時間。當(dāng)線程讀寫申請成功后,開始對共享資源的讀寫操作,該操作持續(xù)相應(yīng)時間后結(jié)束,并釋放共享資源。下面是一個測試數(shù)據(jù)文件的例子:</p><p><b> 1 R 3 5</b></p><p><b> 2 W 4 5</b></p>
7、<p><b> 3 R 5 2</b></p><p><b> 4 R 6 5</b></p><p><b> 5 W 5.1 3</b></p><p> 4 相關(guān)API函數(shù)</p><p> CreateThread()在調(diào)用進(jìn)程的地址空間上創(chuàng)建
8、一個線程</p><p> ExitThread()用于結(jié)束當(dāng)前線程</p><p> Sleep()可在指定的時間內(nèi)掛起當(dāng)前線程</p><p> CreateMutex()創(chuàng)建一個互斥對象,返回對象句柄</p><p> OpenMutex()打開并返回一個已存在的互斥對象句柄,用于后續(xù)訪問</p><p>
9、; ReleaseMutex()釋放對互斥對象的占用,使之成為可用</p><p> WaitForSingleObject()可在指定的時間內(nèi)等待指定對象為可用狀態(tài)</p><p> InitializeCriticalSection()初始化臨界區(qū)對象</p><p> EnterCriticalSection()等待指定臨界區(qū)對象的所有權(quán)</p&
10、gt;<p> LeaveCriticalSection()釋放指定臨界區(qū)對象的所有權(quán)</p><p><b> 二、設(shè)計思路</b></p><p> 將所有的讀者和所有的寫者分別放進(jìn)兩個等待隊列中,當(dāng)讀允許時就讓讀者隊列釋放一個或多個讀者,當(dāng)寫允許時,釋放第一個寫者操作。</p><p><b> 讀者優(yōu)先:
11、 </b></p><p> 如果沒有寫者正在操作,則讀者不需要等待,用一個整型變量readcount記錄當(dāng)前的讀者數(shù)目,用于確定是否釋放寫者線程,(當(dāng)readcout=0 時,說明所有的讀者都已經(jīng)讀完,釋放一個寫者線程),每個讀者開始讀之前都要修改readcount,為了互斥的實(shí)現(xiàn)對readcount 的修改,需要一個互斥對象Mutex來實(shí)現(xiàn)互斥。</p><p> 另外
12、,為了實(shí)現(xiàn)寫-寫互斥,需要一個臨界區(qū)對象 write,當(dāng)寫者發(fā)出寫的請求時,必須先得到臨界區(qū)對象的所有權(quán)。通過這種方法,可以實(shí)現(xiàn)讀寫互斥,當(dāng)readcount=1 時,(即第一個讀者的到來時,),讀者線程也必須申請臨界區(qū)對象的所有權(quán).</p><p> 當(dāng)讀者擁有臨界區(qū)的所有權(quán),寫者都阻塞在臨界區(qū)對象write上。當(dāng)寫者擁有臨界區(qū)對象所有權(quán)時,第一個判斷完readcount==1 后,其余的讀者由于等待對rea
13、dcount的判斷,阻塞在Mutex上!</p><p><b> 寫者優(yōu)先:</b></p><p> 寫者優(yōu)先和讀者優(yōu)先有相同之處,不同的地方在:一旦有一個寫者到來時,應(yīng)該盡快讓寫者進(jìn)行寫,如果有一個寫者在等待,則新到的讀者操作不能讀操作,為此添加一個整型變量writecount,記錄寫者的數(shù)目,當(dāng)writecount=0時才可以釋放讀者進(jìn)行讀操作! 為了實(shí)現(xiàn)
14、對全局變量writecount的互斥訪問,設(shè)置了一個互斥對象Mutex3。</p><p> 為了實(shí)現(xiàn)寫者優(yōu)先,設(shè)置一個臨界區(qū)對象read,當(dāng)有寫者在寫或等待時,讀者必須阻塞在臨界區(qū)對象read上。</p><p> 讀者除了要一個全局變量readcount實(shí)現(xiàn)操作上的互斥外,還需要一個互斥對象對阻塞在read這一個過程實(shí)現(xiàn)互斥,這兩個互斥對象分別為mutex1和mutex2。<
15、/p><p><b> 程序結(jié)構(gòu)</b></p><p><b> 主要代碼進(jìn)行分析:</b></p><p><b> 1、臨界區(qū):</b></p><p> CRITICAL_SECTION RP_Write; //臨界區(qū)</p><p> C
16、RITICAL_SECTION cs_Write;</p><p> CRITICAL_SECTION cs_Read;</p><p> 臨界區(qū)(Critical Section)是一段獨(dú)占對某些共享資源訪問的代碼,在任意時刻只允許一個線程對共享資源進(jìn)行訪問。如果有多個線程試圖同時訪問臨界區(qū),那么在有一個線程進(jìn)入后其他所有試圖訪問此臨界區(qū)的線程將被掛起,并一直持續(xù)到進(jìn)入臨界區(qū)的線程離
17、開。臨界區(qū)在被釋放后,其他線程可以繼續(xù)搶占,并以此達(dá)到用原子方式操作共享資源的目的。</p><p> 臨界區(qū)在使用時以CRITICAL_SECTION結(jié)構(gòu)對象保護(hù)共享資源,并分別用EnterCriticalSection()和LeaveCriticalSection()函數(shù)去標(biāo)識和釋放一個臨界區(qū)。所用到的CRITICAL_SECTION結(jié)構(gòu)對象必須經(jīng)過InitializeCriticalSection()的初
18、始化后才能使用,而且必須確保所有線程中的任何試圖訪問此共享資源的代碼都處在此臨界區(qū)的保護(hù)之下。否則臨界區(qū)將不會起到應(yīng)有的作用,共享資源依然有被破壞的可能。</p><p><b> 2、定義線程結(jié)構(gòu):</b></p><p> struct ThreadInfo </p><p> {int Threadha
19、o; </p><p> char ThreadClass; </p><p> double ThreadStartTime; </p><p> double ThreadRunTime; </p><p><b> };</b></p>&
20、lt;p> 此結(jié)構(gòu)用來存放線程的信息,四個成員變量依次表示線程序號、線程類別、線程開始時間、線程讀寫持續(xù)時間。</p><p><b> 3、互斥對象</b></p><p><b> 創(chuàng)建互斥對象</b></p><p> CreateMutex(NULL,FALSE,"mutex_for_rea
21、dcount");</p><p><b> 參數(shù)含義如下:</b></p><p> NULL表示創(chuàng)建帶有默認(rèn)安全性的內(nèi)核對象</p><p> FALSE表示該互斥對象沒有被任何線程所擁有</p><p> mutex_for_readcount是為內(nèi)核對象賦予名字。</p><
22、p><b> 釋放互斥信號</b></p><p> ReleaseMutex(h_Mutex); </p><p> 對資源具有訪問權(quán)的線程不再需要訪問此資源而要離開時,必須通過ReleaseMutex()函數(shù)來釋放其擁有的互斥對象</p><p><b> 4、創(chuàng)建讀者線程</b></p>
23、<p> CreateThread(NULL,0,\(LPTHREAD_START_ROUTINE)(R_ReaderThread),</p><p> \&thread_info[i],0,&thread_ID);</p><p><b> 參數(shù)含義如下:</b></p><p> NULL表示創(chuàng)建帶有默認(rèn)安
24、全性的內(nèi)核對象</p><p> 0表示新讀者線程擁有自己的堆棧,使用缺省大小:1MB。 </p><p> (LPTHREAD_START_ROUTINE)(R_ReaderThread)表示新讀者線程執(zhí)行的線程函數(shù)的地址</p><p> &thread_info[i]表示在線程啟動執(zhí)行時將該參數(shù)傳遞給讀者線程函數(shù)。</p><
25、p> 0表示讀者線程創(chuàng)建后可以立即進(jìn)行調(diào)度</p><p> &thread_ID表示CreateThread使用這個地址來存放系統(tǒng)分配</p><p> 給新讀者線程的I D</p><p><b> 5、等待函數(shù)</b></p><p> WaitForMultipleObjects(n_th
26、read,h_Thread,TRUE,-1);</p><p> 等待函數(shù)可使線程自愿進(jìn)入等待狀態(tài),直到一個特定的內(nèi)核對象變?yōu)橐淹ㄖ獱顟B(tài)為止</p><p> 參數(shù)含義如下:n_thread表示線程數(shù)量。</p><p> h_Thread是指向線程對象句柄的數(shù)組的指針。</p><p> ture表示:在所有線程對象變?yōu)橐淹ㄖ獱顟B(tài)之
27、前,該函數(shù)將不允許調(diào)用線程運(yùn)行</p><p> 參數(shù) -1 告訴系統(tǒng),調(diào)用線程愿意永遠(yuǎn)等待下去(無限時間量),直到該進(jìn)程終止運(yùn)行。</p><p><b> 三、運(yùn)行結(jié)果</b></p><p><b> 程序運(yùn)行結(jié)果如下:</b></p><p> 請選擇要進(jìn)行的操作:</p>
28、;<p><b> 1 (回車)</b></p><p><b> 1 (回車)</b></p><p> 請選擇要進(jìn)行的操作:</p><p><b> 2 (回車)</b></p><p><b> 四、設(shè)計總結(jié)</b><
29、/p><p> 本次操作系統(tǒng)課程設(shè)計完成的是讀者-寫者問題,通過學(xué)習(xí)對線程及其同步機(jī)制有了很的學(xué)習(xí)和掌握. 并認(rèn)識到同步可以保證在一個時間內(nèi)只有一個線程對某個資源有控制權(quán)。共享資源包括全局變量、公共數(shù)據(jù)成員或者句柄等。同步還可以使得有關(guān)聯(lián)交互作用的代碼按一定的順序執(zhí)行。同時也掌握了實(shí)現(xiàn)線程同步的對象有Critical_section(關(guān)鍵段),Event(事件),Mutex(互斥對象),Semaphores(信號量
30、)并對這些對象理解如下: </p><p> 對于關(guān)鍵段對象:首先,定義一個關(guān)鍵段對象;然后,初始化該對象。初始化時把對象設(shè)置為NOT_SINGALED,表示允許線程使用資源:如果一段程序代碼需要對某個資源進(jìn)行同步保護(hù),則這是一段關(guān)鍵段代碼。在進(jìn)入該關(guān)鍵段代碼前調(diào)用EnterCriticalSection函數(shù),這樣,其他線程都不能執(zhí)行該段代碼,若它們試圖執(zhí)行就會被阻塞。完成關(guān)鍵段的執(zhí)行
31、之后,調(diào)用LeaveCriticalSection函數(shù),其他的線程就可以繼續(xù)執(zhí)行該段代碼。如果該函數(shù)不被調(diào)用,則其他線程將無限期的等待。</p><p> 對于互斥對象 首先,調(diào)用CreateMutex創(chuàng)建互斥對象;然后,調(diào)用等待函數(shù),可以的話利用關(guān)鍵資源;最后,調(diào)用RealseMutex釋放互斥對象?;コ鈱ο罂梢栽谶M(jìn)程間使用,但關(guān)鍵段對象只能用于同一進(jìn)程的線程之間。</p><p>
32、 對于等待函數(shù):等待函數(shù)有:1.等待單個對象的(FOR SINGLE OBJECT): WaitForSingleObject,函數(shù)參數(shù)包括同步對象的句柄和等待時間等。如果等待時間不限制(Infinite),則只有同步對象獲得信號才返回;如果等待時間為0,則在測試了同步對象的狀態(tài)之后馬上返回。2.等待多個對象的(FOR MULTIPLE OBJECTS) WaitForMultipleObjects,函數(shù)參數(shù)包括同步對象的句柄,等待時間
33、,是等待一個還是多個同步對象等等,如果等待時間不限制(Infinite),則只有同步對象獲得信號才返回;如果等待時間為0,則在測試了同步對象的狀態(tài)之后馬上返回。</p><p> 操作系統(tǒng)設(shè)計使我對C++有了一個很好的復(fù)習(xí)和學(xué)習(xí),對線程的創(chuàng)建及同步問題及其同步對象都有了很好的理解。并能初步進(jìn)行簡單的程序編程。并對程序的調(diào)式過程,也使我更好了解到線程同步的具體運(yùn)行過程,使我更好的理解程序。</p>
34、<p> 學(xué)習(xí)語言是一個漫長的過程,我想只有在不斷的實(shí)踐練習(xí)中,才能更好的掌握編程的技巧,提高自己的編程能力,通過此次課設(shè)也讓我深深體會到自己還有很多東西需要學(xué)習(xí),還有很多課程需要復(fù)習(xí)。總之,此次課程設(shè)計使我收益匪淺。</p><p><b> 五、源代碼</b></p><p> #include <windows.h></p>
35、;<p> #include<iostream.h></p><p> #include <conio.h> </p><p> #include "fstream.h" </p><p> int readcount=0; </p><p> int wr
36、itecount=0; </p><p> CRITICAL_SECTION RP_Write; </p><p> CRITICAL_SECTION cs_Write;</p><p> CRITICAL_SECTION cs_Read;</p><p> struct ThreadInfo
37、 </p><p> {int Threadhao; </p><p> char ThreadClass; </p><p> double ThreadStartTime; </p><p> double ThreadRunTime; //線程讀寫持續(xù)時間&l
38、t;/p><p><b> };</b></p><p> void ReaderFun(char* file);</p><p> void R_ReaderThread(void *p);</p><p> void R_WriterThread(void *p);</p><p>
39、void WriterFun(char* file); </p><p> void W_ReaderThread(void *p);</p><p> void W_WriterThread(void *p);</p><p> int main()</p><p><b> {</b></p>
40、<p> char select;</p><p> while (true)</p><p><b> {</b></p><p> cout<<"***************讀者-寫者問題**************\n"<<endl;</p><p>
41、; cout<<" 1:讀者優(yōu)先"<<endl;</p><p> cout<<" 2:寫者優(yōu)先"<<endl;</p><p> cout<<" 3:退出"<<e
42、ndl;</p><p> cout<<"\n******************************************\n"<<endl;</p><p> cout<<"請選擇要進(jìn)行的操作:"<<endl;</p><p><b> do</b
43、></p><p><b> {</b></p><p> cin>>select;</p><p> if(select!='1' && select!='2' && select!='3')</p><p> c
44、out<<"你操作有誤,請重試!"<<endl;</p><p> }while (select!='1' && select!='2' && select!='3');</p><p> system("cls");</p>&
45、lt;p> if (select=='3')</p><p><b> return 0;</b></p><p> else if (select=='1')</p><p> ReaderFun("exia.txt");</p><p> else
46、if(select=='2')</p><p> WriterFun("exia.txt");</p><p> cout<<"\n是否繼續(xù)? 1. 繼續(xù) 2.退出"<<endl;;</p><p><b> do</b></p><
47、p><b> {</b></p><p> cin>>select;</p><p> if(select!='1' && select!='2' )</p><p> cout<<"你操作有誤,請重試!"<<endl;<
48、/p><p> }while (select!='1' && select!='2');</p><p> if(select=='2')</p><p><b> return 0;</b></p><p> system("cls"
49、;);</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> void ReaderFun(char* file)</p><p><b>
50、 {</b></p><p> DWORD n_thread=0; //線程數(shù)初值為0</p><p> DWORD thread_ID; </p><p> DWORD wait_for_all; </p><p><b> //臨界資源</b></p&
51、gt;<p> HANDLE h_Mutex;</p><p> //互斥對象(h_Mutex)確保線程擁有對單個資源的互斥訪問權(quán)</p><p> h_Mutex=CreateMutex(NULL,FALSE,"mutex_for_readcount");</p><p> /*創(chuàng)建互斥對象, </p>&l
52、t;p> FALSE表示該互斥對象沒有被任何線程所擁有</p><p> mutex_for_readcount是為內(nèi)核對象賦予名字。</p><p><b> */</b></p><p> HANDLE h_Thread[70];//線程對象數(shù)組,最大70</p><p> ThreadInfo t
53、hread_info[70];</p><p> readcount=0; </p><p> InitializeCriticalSection(&RP_Write); //初始化臨界區(qū)</p><p> ifstream inFile;</p><p> inFile.open(file);
54、 </p><p> cout<<"讀者優(yōu)先:\n"<<endl;</p><p> while (inFile)</p><p><b> {</b></p><p> //讀入每一個讀者、寫者的信息</p><p> in
55、File>>thread_info[n_thread].Threadhao>>thread_info[n_thread].ThreadClass</p><p> >>thread_info[n_thread].ThreadStartTime>>thread_info[n_thread].ThreadRunTime;</p><p> i
56、f (-1 == inFile.get())</p><p><b> break;</b></p><p> n_thread++;//線程數(shù)加一</p><p><b> }</b></p><p> for (int i=0;i<(int)(n_thread);i++)</
57、p><p><b> {</b></p><p> if (thread_info[i].ThreadClass=='r')</p><p><b> //創(chuàng)建讀者線程</b></p><p> h_Thread[i]=CreateThread(NULL,0,\</p>
58、;<p> (LPTHREAD_START_ROUTINE)(R_ReaderThread),\</p><p> &thread_info[i],0,&thread_ID);</p><p><b> /*</b></p><p> 0表示CreateThread就保留一個區(qū)域,并且將鏈接程序</p
59、><p> 嵌入. EXE文件的/ STACK鏈接程序開關(guān)信息指明</p><p> 的存儲器容量分配給線程堆棧。</p><p> (LPTHREAD_START_ROUTINE)(R_ReaderThread)表示新線程執(zhí)行的線程函數(shù)的地址</p><p> &thread_info[i]表示在線程啟動執(zhí)行時將該參數(shù)傳遞給線程
60、函數(shù)。</p><p> 0表示讀者線程創(chuàng)建后可以立即進(jìn)行調(diào)度</p><p> &thread_ID表示CreateThread使用這個地址來存放系統(tǒng)分配</p><p> 給新讀者線程的I D</p><p><b> */</b></p><p><b> els
61、e</b></p><p><b> //創(chuàng)建寫者線程</b></p><p> h_Thread[i]=CreateThread(NULL,0,\</p><p> (LPTHREAD_START_ROUTINE)(R_WriterThread),\</p><p> &thread_inf
62、o[i],0,&thread_ID);</p><p><b> }</b></p><p> wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);</p><p><b> /*</b></p><p> 等
63、待函數(shù)可使線程自愿進(jìn)入等待狀態(tài),直到一個特定的內(nèi)核對象變?yōu)橐淹ㄖ獱顟B(tài)為止</p><p> n_thread表示線程數(shù)量。</p><p> h_Thread是指向線程對象句柄的數(shù)組的指針。</p><p> ture表示:在所有線程對象變?yōu)橐淹ㄖ獱顟B(tài)之前,該函數(shù)將不允許調(diào)用線程運(yùn)行</p><p> 參數(shù) -1 告訴系統(tǒng),調(diào)用線程愿
64、意永遠(yuǎn)等待下去(無限時間量),直到該進(jìn)程終止運(yùn)行。</p><p><b> */</b></p><p> cout<<"所有的讀者和寫者線程完成操作."<<endl;</p><p><b> }</b></p><p> void R_Rea
65、derThread(void *p)</p><p><b> {</b></p><p><b> //互斥變量</b></p><p> HANDLE h_Mutex;</p><p> h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mut
66、ex_for_readcount");</p><p><b> /*</b></p><p> 獲得它自己進(jìn)程與現(xiàn)有互斥對象相關(guān)的句柄:</p><p><b> */</b></p><p> DWORD wait_for_mutex; //等待互斥變量所有權(quán)</p&
67、gt;<p> DWORD m_delay; //延遲時間</p><p> DWORD m_ThreadRunTime; //讀文件持續(xù)時間</p><p> int m_Threadhao; //線程序號</p><p> m_Threadhao=((ThreadInfo *)(p))-&
68、gt;Threadhao;</p><p> m_delay=(DWORD)(((ThreadInfo *)(p))->ThreadStartTime*100);</p><p> m_ThreadRunTime=(DWORD)(((ThreadInfo *)(p))->ThreadRunTime*100);</p><p> Sleep(m_de
69、lay); //延遲等待</p><p> cout<<"讀者線程 "<<m_Threadhao<<" 發(fā)出讀請求."<<endl;</p><p> wait_for_mutex=WaitForSingleObject(h_Mut
70、ex,-1); //等待互斥信號,保證對readcount的訪問、</p><p><b> //修改互斥</b></p><p> readcount++; </p><p> if (readcount==1)</p><p> E
71、nterCriticalSection(&RP_Write);//禁止寫者進(jìn)入 </p><p> ReleaseMutex(h_Mutex);//釋放互斥對象,允許下個讀者繼續(xù)讀:</p><p> cout<<"讀者線程 "<<m_Threadhao<<" 開始讀文件."<
72、<endl;</p><p> Sleep(m_ThreadRunTime);</p><p> cout<<"讀者線程 "<<m_Threadhao<<" 完成讀文件."<<endl;</p><p> wait_for_mutex=WaitForSingleObj
73、ect(h_Mutex,-1); //等待互斥信號,保證對readcount的訪問、修改互斥</p><p> readcount--; //讀者數(shù)目減少</p><p> if (readcount==0)</p><p> LeaveCriticalSection(&RP_W
74、rite); //如果所有讀者讀完,喚醒寫者</p><p> ReleaseMutex(h_Mutex);//釋放互斥信號</p><p><b> }</b></p><p> void R_WriterThread(void *p)</p><p><b> {</b>
75、;</p><p> DWORD m_delay; </p><p> DWORD m_ThreadRunTime; //讀文件持續(xù)時間</p><p> int m_Threadhao; </p><p> //從參數(shù)中獲得信息</p><p> m_Threadhao=(
76、(ThreadInfo *)(p))->Threadhao;</p><p> m_delay=(DWORD)(((ThreadInfo *)(p))->ThreadStartTime*100);</p><p> m_ThreadRunTime=(DWORD)(((ThreadInfo *)(p))->ThreadRunTime*100);</p>&
77、lt;p> Sleep(m_delay); //延遲等待</p><p> cout<<"寫者線程 "<<m_Threadhao<<" 發(fā)出寫請求."<<endl;</p><p> EnterCriticalSection
78、(&RP_Write);//禁止下一位寫者進(jìn)入</p><p> cout<<"寫者線程 "<<m_Threadhao<<" 開始寫文件."<<endl;</p><p> Sleep(m_ThreadRunTime);</p><p><b> //退出
79、線程</b></p><p> cout<<"寫者線程 "<<m_Threadhao<<" 完成寫文件."<<endl;</p><p> LeaveCriticalSection(&RP_Write); //如果所有讀者讀完,喚醒寫者</p>&
80、lt;p><b> }</b></p><p> void WriterFun(char* file)</p><p><b> {</b></p><p> DWORD n_thread=0; //線程數(shù)目</p><p> DWORD thread_ID;
81、 </p><p> DWORD wait_for_all; </p><p><b> //互斥對象</b></p><p> HANDLE h_Mutex1, h_Mutex2, h_Mutex3;</p><p> h_Mutex1 = CreateMutex(NULL, FALSE, &q
82、uot;mutex_for_writecount");</p><p> h_Mutex2 = CreateMutex(NULL, FALSE, "mutex_for_readcount");</p><p> h_Mutex3 = CreateMutex(NULL, FALSE, "mutex_for_read");</p>
83、;<p><b> //線程對象數(shù)組</b></p><p> HANDLE h_Thread[70];</p><p> ThreadInfo thread_info[70];</p><p> readcount=0; </p><p> InitializeCriticalSecti
84、on(&cs_Write); //初始化臨界區(qū)</p><p> InitializeCriticalSection(&cs_Read);</p><p> ifstream inFile;</p><p> inFile.open(file); </p><p> cout&
85、lt;<"寫者優(yōu)先:\n"<<endl;</p><p> while (inFile)</p><p><b> {</b></p><p> //讀入每一個讀者、寫者的信息</p><p> inFile>>thread_info[n_thread].Thre
86、adhao>>thread_info[n_thread].ThreadClass</p><p> >>thread_info[n_thread].ThreadStartTime>>thread_info[n_thread].ThreadRunTime;</p><p> if(-1 == inFile.get())</p><p
87、><b> break;</b></p><p> n_thread++;//線程數(shù)加一</p><p><b> }</b></p><p> for (int i=0;i<(int)(n_thread);i++)</p><p><b> {</b>&
88、lt;/p><p> if (thread_info[i].ThreadClass=='r')</p><p><b> //創(chuàng)建讀者線程</b></p><p> h_Thread[i]=CreateThread(NULL,0,\</p><p> (LPTHREAD_START_ROUTINE)(
89、W_ReaderThread),\</p><p> &thread_info[i],0,&thread_ID);</p><p><b> else</b></p><p><b> //創(chuàng)建寫者線程</b></p><p> h_Thread[i]=CreateThrea
90、d(NULL,0,\</p><p> (LPTHREAD_START_ROUTINE)(W_WriterThread),\</p><p> &thread_info[i],0,&thread_ID);</p><p><b> }</b></p><p> //等待所有線程結(jié)束</p&g
91、t;<p> wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);</p><p> cout<<"所有的讀者和寫者線程完成操作."<<endl;</p><p><b> }</b></p><p> v
92、oid W_WriterThread(void *p)</p><p><b> {</b></p><p><b> //互斥變量</b></p><p> HANDLE h_Mutex1;</p><p> h_Mutex1 = OpenMutex(MUTEX_ALL_ACCESS,FA
93、LSE,"mutex_for_writecount");</p><p> DWORD wait_for_mutex; //等待互斥變量所有權(quán)</p><p> DWORD m_delay; //延遲時間</p><p> DWORD m_ThreadRunTime; //讀文件持時續(xù)間</p>
94、;<p> int m_Threadhao; </p><p> m_Threadhao=((ThreadInfo *)(p))->Threadhao;</p><p> m_delay=(DWORD)(((ThreadInfo *)(p))->ThreadStartTime*100);</p><p> m_T
95、hreadRunTime=(DWORD)(((ThreadInfo *)(p))->ThreadRunTime*100);</p><p> Sleep(m_delay); </p><p> cout<<"寫者線程 "<<m_Threadhao<<&quo
96、t; 發(fā)出寫請求."<<endl;</p><p> wait_for_mutex=WaitForSingleObject(h_Mutex1,-1); </p><p> writecount++;</p><p> if (writecount==1)</p><p> EnterCriticalSectio
97、n(&cs_Read);</p><p> ReleaseMutex(h_Mutex1);</p><p> EnterCriticalSection(&cs_Write);</p><p> cout<<"寫者線程 "<<m_Threadhao<<" 開始寫文件."&
98、lt;<endl;</p><p> Sleep(m_ThreadRunTime);</p><p> cout<<"寫者線程 "<<m_Threadhao<<" 完成寫文件."<<endl;</p><p> LeaveCriticalSection(&cs
99、_Write);</p><p> wait_for_mutex=WaitForSingleObject(h_Mutex1,-1); </p><p> writecount--;</p><p> if(writecount == 0)</p><p> LeaveCriticalSection(&cs_Read);<
100、;/p><p> ReleaseMutex(h_Mutex1);</p><p><b> }</b></p><p> void W_ReaderThread(void *p)</p><p><b> {</b></p><p> HANDLE h_Mutex2,
101、h_Mutex3;</p><p> h_Mutex2 = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_readcount");</p><p> h_Mutex3 = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_read");</p><
102、p> DWORD wait_for_mutex, wait_for_mutex1; //等待互斥變量所有權(quán)</p><p> DWORD m_delay; </p><p> DWORD m_ThreadRunTime; //讀文件持續(xù)時間</p><p> int m_Threadhao; &l
103、t;/p><p> m_Threadhao=((ThreadInfo *)(p))->Threadhao;</p><p> m_delay=(DWORD)(((ThreadInfo *)(p))->ThreadStartTime*100);</p><p> m_ThreadRunTime=(DWORD)(((ThreadInfo *)(p))-&g
104、t;ThreadRunTime*100);</p><p> Sleep(m_delay);</p><p> cout<<"讀者線程 "<<m_Threadhao<<" 發(fā)出讀請求."<<endl;</p><p> wait_for_mutex1=WaitForSing
105、leObject(h_Mutex3,-1);</p><p> EnterCriticalSection(&cs_Read);</p><p> LeaveCriticalSection(&cs_Read);</p><p> ReleaseMutex(h_Mutex3);</p><p> wait_for_mute
106、x=WaitForSingleObject(h_Mutex2,-1); </p><p> readcount++;</p><p> if (readcount == 1)</p><p> EnterCriticalSection(&cs_Write);</p><p> ReleaseMutex(h_Mutex2);&l
107、t;/p><p> cout<<"讀者線程 "<<m_Threadhao<<" 開始讀文件."<<endl;</p><p> Sleep(m_ThreadRunTime);</p><p> cout<<"讀者線程 "<<m_Thr
108、eadhao<<" 完成讀文件."<<endl;</p><p> wait_for_mutex=WaitForSingleObject(h_Mutex2,-1);</p><p> readcount--;</p><p> if (readcount == 0)</p><p> Lea
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計--讀者寫者問題
- 操作系統(tǒng)課程設(shè)計-讀者寫者問題
- 操作系統(tǒng)課程設(shè)計——讀者寫者問題
- 操作系統(tǒng)原理課程設(shè)計讀者-寫者問題的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計-- linux下讀者與寫者的問題實(shí)現(xiàn)
- 讀者與寫者-操作系統(tǒng)課程設(shè)計實(shí)驗(yàn)報告
- 讀者寫者問題-操作系統(tǒng)實(shí)驗(yàn)報告
- 操作系統(tǒng)課程設(shè)計報告-讀者寫著問題
- 北理工操作系統(tǒng)實(shí)驗(yàn)二讀者寫者問題
- 《操作系統(tǒng)》課程設(shè)計--基于信號量與pv操作同步機(jī)制的讀者寫者問題的設(shè)計與實(shí)現(xiàn)
- 讀者寫者課程設(shè)計
- 讀者與寫者問題課程設(shè)計報告
- 操作系統(tǒng)課程設(shè)計實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題
- 操作系統(tǒng)課程設(shè)計——操作系統(tǒng)課程設(shè)計模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計——生產(chǎn)者消費(fèi)者問題
- 操作系統(tǒng)課程設(shè)計——生產(chǎn)者消費(fèi)者問題
- 操作系統(tǒng)課程設(shè)計--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 生產(chǎn)者消費(fèi)者問題操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--蘋果問題
評論
0/150
提交評論