操作系統課程設計---讀者-寫者問題實現_第1頁
已閱讀1頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  操作系統課程設計報告</p><p>  一、操作系統課程設計任務書</p><p><b>  讀者-寫者問題實現</b></p><p><b>  設計目的</b></p><p>  通過實現經典的讀者寫者問題,鞏固對線程及其同步機制的學習效果,加深對相關基本概念的理解

2、,并學習如何將基本原理和實際設計有機的結合。</p><p><b>  2 設計內容</b></p><p>  在Windows 2000/XP環(huán)境下,使用多線程和信號量機制實現經典的讀者寫者問題,每個線程代表一個讀者或一個寫者。</p><p>  每個線程按相應測試數據文件的要求,進行讀寫操作。請用信號量機制分別實現讀者優(yōu)先和寫者優(yōu)先

3、的讀者-寫者問題。</p><p>  讀者-寫者問題的讀寫操作限制:</p><p>  (1)寫-寫互斥,即不能有兩個寫者同時進行寫操作</p><p>  (2)讀-寫互斥,即不能同時有一個讀者在讀,同時卻有一個寫者在寫</p><p>  (3)讀-讀允許,即可以有二個以上的讀者同時讀</p><p>  讀者

4、優(yōu)先的附加限制:如果一個讀者申請進行讀操作時已有另一讀者正在進行讀操作,則該讀者可直接開始讀操作。</p><p>  寫者優(yōu)先的附加限制:如果一個讀者申請進行讀操作時已有另一寫者在等待訪問共享資源,則該讀者必須等到沒有寫者處于等待狀態(tài)后才能開始讀操作。</p><p>  運行結果顯示要求:要求在每個線程創(chuàng)建、發(fā)出讀寫操作申請、開始讀寫操作和結束讀寫操作時分別顯示一行提示信息,以確信所有

5、處理都遵守相應的讀寫操作限制。</p><p>  3 測試數據文件格式</p><p>  測試數據文件包括n 行測試數據,分別描述創(chuàng)建的n 個線程是讀者還是寫者,以及讀寫操作的開始時間和持續(xù)時間。每行測試數據包括四個字段,各字段間用空格分隔。第一字段為一個正整數,表示線程序號。第二字段表示相應線程角色,R 表示讀者是,W 表示寫者。第三字段為一個正數,表示讀寫操作的開始時間。線程創(chuàng)建

6、后,延時相應時間(單位為秒)后發(fā)出對共享資源的讀寫申請。第四字段為一個正數,表示讀寫操作的持續(xù)時間。當線程讀寫申請成功后,開始對共享資源的讀寫操作,該操作持續(xù)相應時間后結束,并釋放共享資源。下面是一個測試數據文件的例子:</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 相關API函數</p><p>  CreateThread()在調用進程的地址空間上創(chuàng)建

8、一個線程</p><p>  ExitThread()用于結束當前線程</p><p>  Sleep()可在指定的時間內掛起當前線程</p><p>  CreateMutex()創(chuàng)建一個互斥對象,返回對象句柄</p><p>  OpenMutex()打開并返回一個已存在的互斥對象句柄,用于后續(xù)訪問</p><p>

9、;  ReleaseMutex()釋放對互斥對象的占用,使之成為可用</p><p>  WaitForSingleObject()可在指定的時間內等待指定對象為可用狀態(tài)</p><p>  InitializeCriticalSection()初始化臨界區(qū)對象</p><p>  EnterCriticalSection()等待指定臨界區(qū)對象的所有權</p&

10、gt;<p>  LeaveCriticalSection()釋放指定臨界區(qū)對象的所有權</p><p><b>  二、設計思路</b></p><p>  將所有的讀者和所有的寫者分別放進兩個等待隊列中,當讀允許時就讓讀者隊列釋放一個或多個讀者,當寫允許時,釋放第一個寫者操作。</p><p><b>  讀者優(yōu)先:

11、 </b></p><p>  如果沒有寫者正在操作,則讀者不需要等待,用一個整型變量readcount記錄當前的讀者數目,用于確定是否釋放寫者線程,(當readcout=0 時,說明所有的讀者都已經讀完,釋放一個寫者線程),每個讀者開始讀之前都要修改readcount,為了互斥的實現對readcount 的修改,需要一個互斥對象Mutex來實現互斥。</p><p>  另外

12、,為了實現寫-寫互斥,需要一個臨界區(qū)對象 write,當寫者發(fā)出寫的請求時,必須先得到臨界區(qū)對象的所有權。通過這種方法,可以實現讀寫互斥,當readcount=1 時,(即第一個讀者的到來時,),讀者線程也必須申請臨界區(qū)對象的所有權.</p><p>  當讀者擁有臨界區(qū)的所有權,寫者都阻塞在臨界區(qū)對象write上。當寫者擁有臨界區(qū)對象所有權時,第一個判斷完readcount==1 后,其余的讀者由于等待對rea

13、dcount的判斷,阻塞在Mutex上!</p><p><b>  寫者優(yōu)先:</b></p><p>  寫者優(yōu)先和讀者優(yōu)先有相同之處,不同的地方在:一旦有一個寫者到來時,應該盡快讓寫者進行寫,如果有一個寫者在等待,則新到的讀者操作不能讀操作,為此添加一個整型變量writecount,記錄寫者的數目,當writecount=0時才可以釋放讀者進行讀操作! 為了實現

14、對全局變量writecount的互斥訪問,設置了一個互斥對象Mutex3。</p><p>  為了實現寫者優(yōu)先,設置一個臨界區(qū)對象read,當有寫者在寫或等待時,讀者必須阻塞在臨界區(qū)對象read上。</p><p>  讀者除了要一個全局變量readcount實現操作上的互斥外,還需要一個互斥對象對阻塞在read這一個過程實現互斥,這兩個互斥對象分別為mutex1和mutex2。<

15、/p><p><b>  程序結構</b></p><p><b>  主要代碼進行分析:</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)是一段獨占對某些共享資源訪問的代碼,在任意時刻只允許一個線程對共享資源進行訪問。如果有多個線程試圖同時訪問臨界區(qū),那么在有一個線程進入后其他所有試圖訪問此臨界區(qū)的線程將被掛起,并一直持續(xù)到進入臨界區(qū)的線程離

17、開。臨界區(qū)在被釋放后,其他線程可以繼續(xù)搶占,并以此達到用原子方式操作共享資源的目的。</p><p>  臨界區(qū)在使用時以CRITICAL_SECTION結構對象保護共享資源,并分別用EnterCriticalSection()和LeaveCriticalSection()函數去標識和釋放一個臨界區(qū)。所用到的CRITICAL_SECTION結構對象必須經過InitializeCriticalSection()的初

18、始化后才能使用,而且必須確保所有線程中的任何試圖訪問此共享資源的代碼都處在此臨界區(qū)的保護之下。否則臨界區(qū)將不會起到應有的作用,共享資源依然有被破壞的可能。</p><p><b>  2、定義線程結構:</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>  此結構用來存放線程的信息,四個成員變量依次表示線程序號、線程類別、線程開始時間、線程讀寫持續(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>  參數含義如下:</b></p><p>  NULL表示創(chuàng)建帶有默認安全性的內核對象</p><p>  FALSE表示該互斥對象沒有被任何線程所擁有</p><p>  mutex_for_readcount是為內核對象賦予名字。</p><

22、p><b>  釋放互斥信號</b></p><p>  ReleaseMutex(h_Mutex); </p><p>  對資源具有訪問權的線程不再需要訪問此資源而要離開時,必須通過ReleaseMutex()函數來釋放其擁有的互斥對象</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>  參數含義如下:</b></p><p>  NULL表示創(chuàng)建帶有默認安

24、全性的內核對象</p><p>  0表示新讀者線程擁有自己的堆棧,使用缺省大?。?MB。 </p><p>  (LPTHREAD_START_ROUTINE)(R_ReaderThread)表示新讀者線程執(zhí)行的線程函數的地址</p><p>  &thread_info[i]表示在線程啟動執(zhí)行時將該參數傳遞給讀者線程函數。</p><

25、p>  0表示讀者線程創(chuàng)建后可以立即進行調度</p><p>  &thread_ID表示CreateThread使用這個地址來存放系統分配</p><p>  給新讀者線程的I D</p><p><b>  5、等待函數</b></p><p>  WaitForMultipleObjects(n_th

26、read,h_Thread,TRUE,-1);</p><p>  等待函數可使線程自愿進入等待狀態(tài),直到一個特定的內核對象變?yōu)橐淹ㄖ獱顟B(tài)為止</p><p>  參數含義如下:n_thread表示線程數量。</p><p>  h_Thread是指向線程對象句柄的數組的指針。</p><p>  ture表示:在所有線程對象變?yōu)橐淹ㄖ獱顟B(tài)之

27、前,該函數將不允許調用線程運行</p><p>  參數 -1 告訴系統,調用線程愿意永遠等待下去(無限時間量),直到該進程終止運行。</p><p><b>  三、運行結果</b></p><p><b>  程序運行結果如下:</b></p><p>  請選擇要進行的操作:</p>

28、;<p><b>  1 (回車)</b></p><p><b>  1 (回車)</b></p><p>  請選擇要進行的操作:</p><p><b>  2 (回車)</b></p><p><b>  四、設計總結</b><

29、/p><p>  本次操作系統課程設計完成的是讀者-寫者問題,通過學習對線程及其同步機制有了很的學習和掌握. 并認識到同步可以保證在一個時間內只有一個線程對某個資源有控制權。共享資源包括全局變量、公共數據成員或者句柄等。同步還可以使得有關聯交互作用的代碼按一定的順序執(zhí)行。同時也掌握了實現線程同步的對象有Critical_section(關鍵段),Event(事件),Mutex(互斥對象),Semaphores(信號量

30、)并對這些對象理解如下: </p><p>  對于關鍵段對象:首先,定義一個關鍵段對象;然后,初始化該對象。初始化時把對象設置為NOT_SINGALED,表示允許線程使用資源:如果一段程序代碼需要對某個資源進行同步保護,則這是一段關鍵段代碼。在進入該關鍵段代碼前調用EnterCriticalSection函數,這樣,其他線程都不能執(zhí)行該段代碼,若它們試圖執(zhí)行就會被阻塞。完成關鍵段的執(zhí)行

31、之后,調用LeaveCriticalSection函數,其他的線程就可以繼續(xù)執(zhí)行該段代碼。如果該函數不被調用,則其他線程將無限期的等待。</p><p>  對于互斥對象 首先,調用CreateMutex創(chuàng)建互斥對象;然后,調用等待函數,可以的話利用關鍵資源;最后,調用RealseMutex釋放互斥對象。互斥對象可以在進程間使用,但關鍵段對象只能用于同一進程的線程之間。</p><p> 

32、 對于等待函數:等待函數有:1.等待單個對象的(FOR SINGLE OBJECT): WaitForSingleObject,函數參數包括同步對象的句柄和等待時間等。如果等待時間不限制(Infinite),則只有同步對象獲得信號才返回;如果等待時間為0,則在測試了同步對象的狀態(tài)之后馬上返回。2.等待多個對象的(FOR MULTIPLE OBJECTS) WaitForMultipleObjects,函數參數包括同步對象的句柄,等待時間

33、,是等待一個還是多個同步對象等等,如果等待時間不限制(Infinite),則只有同步對象獲得信號才返回;如果等待時間為0,則在測試了同步對象的狀態(tài)之后馬上返回。</p><p>  操作系統設計使我對C++有了一個很好的復習和學習,對線程的創(chuàng)建及同步問題及其同步對象都有了很好的理解。并能初步進行簡單的程序編程。并對程序的調式過程,也使我更好了解到線程同步的具體運行過程,使我更好的理解程序。</p>

34、<p>  學習語言是一個漫長的過程,我想只有在不斷的實踐練習中,才能更好的掌握編程的技巧,提高自己的編程能力,通過此次課設也讓我深深體會到自己還有很多東西需要學習,還有很多課程需要復習。總之,此次課程設計使我收益匪淺。</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<<"請選擇要進行的操作:"<<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; //線程數初值為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)確保線程擁有對單個資源的互斥訪問權</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是為內核對象賦予名字。</p><p><b>  */</b></p><p>  HANDLE h_Thread[70];//線程對象數組,最大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++;//線程數加一</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鏈接程序開關信息指明</p><p>  的存儲器容量分配給線程堆棧。</p><p>  (LPTHREAD_START_ROUTINE)(R_ReaderThread)表示新線程執(zhí)行的線程函數的地址</p><p>  &thread_info[i]表示在線程啟動執(zhí)行時將該參數傳遞給線程

60、函數。</p><p>  0表示讀者線程創(chuàng)建后可以立即進行調度</p><p>  &thread_ID表示CreateThread使用這個地址來存放系統分配</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、待函數可使線程自愿進入等待狀態(tài),直到一個特定的內核對象變?yōu)橐淹ㄖ獱顟B(tài)為止</p><p>  n_thread表示線程數量。</p><p>  h_Thread是指向線程對象句柄的數組的指針。</p><p>  ture表示:在所有線程對象變?yōu)橐淹ㄖ獱顟B(tài)之前,該函數將不允許調用線程運行</p><p>  參數 -1 告訴系統,調用線程愿

64、意永遠等待下去(無限時間量),直到該進程終止運行。</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>  獲得它自己進程與現有互斥對象相關的句柄:</p><p><b>  */</b></p><p>  DWORD wait_for_mutex; //等待互斥變量所有權</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);//禁止寫者進入 </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--; //讀者數目減少</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>  //從參數中獲得信息</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);//禁止下一位寫者進入</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; //線程數目</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>  //線程對象數組</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++;//線程數加一</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>  //等待所有線程結束</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; //等待互斥變量所有權</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; //等待互斥變量所有權</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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論