2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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)收的老師是xx老師,他當(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詢問(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)老師們,特別是xx老師對(duì)我的啟發(fā)。</p><p&

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論