程序同步 寫者優先

2021-04-01 00:10:46 字數 3466 閱讀 5849

在windows 2000 環境下,建立乙個包含n 個執行緒的控制台程序。用這n 個執行緒來表示n

個讀者或寫者。每個執行緒按相應測試資料檔案的要求,進行讀寫操作。請用訊號量機制分別

實現讀者優先和寫者優先的讀者-寫者問題。

讀者-寫者問題的讀寫操作限制:

1)寫-寫互斥;

2)讀-寫互斥;

3)讀-讀允許;

讀者優先的附加限制:如果乙個讀者申請進行讀操作時已有另一讀者正在進行讀操作,

則該讀者可直接開始讀操作。

寫者優先的附加限制:如果乙個讀者申請進行讀操作時已有另一寫者在等待訪問共享資

源,則該讀者必須等到沒有寫者處於等待狀態後才能開始讀操作。

執行結果顯示要求:要求在每個執行緒建立、發出讀寫操作申請、開始讀寫操作和結束讀

寫操作時分別顯示一行提示資訊,以確信所有處理都遵守相應的讀寫操作限制。

測試資料檔案格式

測試資料檔案包括n 行測試資料,分別描述建立的n 個執行緒是讀者還是寫者,以及讀寫

操作的開始時間和持續時間。每行測試資料報括四個字段,各字段間用空格分隔。第一字段

為乙個正整數,表示線程式號。第二字段表示相應執行緒角色,r 表示讀者是,w 表示寫者。

第三欄位為乙個正數,表示讀寫操作的開始時間。執行緒建立後,延時相應時間(單位為秒)

後發出對共享資源的讀寫申請。第四欄位為乙個正數,表示讀寫操作的持續時間。當執行緒讀

寫申請成功後,開始對共享資源的讀寫操作,該操作持續相應時間後結束,並釋放共享資源。

下面是乙個測試資料檔案的例子:

1 r 3 5

2 w 4 5

3 r 5 2

4 r 6 5

源**如下:

#define  max_person   100

#define  reader       0

#define  writer       1

#define  end         -1

#define  r            reader

#define  w            writer

typedef struct _person

person;

person g_persons[max_person];

int    g_numperson = 0;

long   g_currenttime= 0;

int    g_personlists = ;

int    g_numofreading = 0;

int    g_numofwriterequest = 0;

handle g_hreadsemaphore;

handle g_hwritesemaphore;

void             createpersonlist(int *ppersonlist);

bool             createreader(int starttime,int worktime,int id);

bool             createwriter(int starttime,int worktime,int id);

dword  winapi    readerproc(lpvoid lpparam);

dword  winapi    writerproc(lpvoid lpparam);

int main()

return 0;

}void createpersonlist(int *ppersonlists)

if(!ret)

printf("create person %d is wrong/n",plist[0]);

plist += 4; // move to next person list}}

dword  winapi readerproc(lpvoid lpparam)

printf("reader %d is requesting .../n",pperson->m_nid);

// wait for the write request

while(g_numofwriterequest != 0) {}

waitforsingleobject(g_hreadsemaphore,infinite);

if(g_numofreading ==0)

g_numofreading++;

releasesemaphore(g_hreadsemaphore,1,null);

// modify the reader's real start time

pperson->m_nstarttime = g_currenttime;

printf("reader %d is reading the shared buffer.../n",pperson->m_nid);

while(g_currenttime <= pperson->m_nstarttime + pperson->m_nworktime)

printf("reader %d is exit.../n",pperson->m_nid);

waitforsingleobject(g_hreadsemaphore,infinite);

g_numofreading--;

if(g_numofreading == 0)

releasesemaphore(g_hreadsemaphore,1,null);

exitthread(0);

return 0;

}dword  winapi writerproc(lpvoid lpparam)

printf("writer %d is requesting .../n",pperson->m_nid);

g_numofwriterequest++;

waitforsingleobject(g_hwritesemaphore,infinite);

// modify the writer's real start time

pperson->m_nstarttime = g_currenttime;

printf("writer %d is writting the shared buffer.../n",pperson->m_nid);

while(g_currenttime <= pperson->m_nstarttime + pperson->m_nworktime)

printf("writer %d is exit.../n",pperson->m_nid);

g_numofwriterequest--;

releasesemaphore(g_hwritesemaphore,1,null);

exitthread(0);

return 0;

}bool createreader(int starttime,int worktime,int id)

bool createwriter(int starttime,int worktime,int id)

作業系統實驗程序同步 寫者優先

實習1 程序同步 寫者優先 實習要求 在windows 2000 環境下,建立乙個包含n 個執行緒的控制台程序。用這n 個執行緒來表示n 個讀者或寫者。每個執行緒按相應測試資料檔案的要求,進行讀寫操作。請用訊號量機制分別 實現讀者優先和寫者優先的讀者 寫者問題。讀者 寫者問題的讀寫操作限制 1 寫 ...

讀者和寫者問題 程序同步

出處 http dantvt.spaces.live.com 讀者 寫者問題 寫者優先與公平競爭 多程序對共享資源互斥訪問及程序同步的經典問題 設有一檔案f,多個併發讀程序和寫程序都要訪問,要求 1 讀寫互斥 2 寫寫互斥 3 允許多個讀程序同時訪問 採用記錄型訊號量機制解決 較常見的寫法 sema...

經典程序同步問題 讀者寫者

讀者 寫者問題 問題描述 有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但是如果某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。簡單來說,你可以乙個文件開啟好多,但是你不能邊讀邊寫。從上述來看,得滿足以下幾個要求。允許多個...