實習1:程序同步 -- 寫者優先
實習要求
在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)
程序同步 寫者優先
在windows 2000 環境下,建立乙個包含n 個執行緒的控制台程序。用這n 個執行緒來表示n 個讀者或寫者。每個執行緒按相應測試資料檔案的要求,進行讀寫操作。請用訊號量機制分別 實現讀者優先和寫者優先的讀者 寫者問題。讀者 寫者問題的讀寫操作限制 1 寫 寫互斥 2 讀 寫互斥 3 讀 讀允許...
作業系統 程序同步
臨界資源 critical resouce 臨界區 critical section 硬體同步機制 訊號量機制 訊號量的應用 管程3使用多道批處理系統不僅能有效的改善資源的利用率,還可以顯著地提高系統的吞吐量,但同時會使系統變得更加複雜,會使程式的執行結果存在不確定性。所以必須引入程序同步機制從而保...
作業系統 程序同步
引入程序 提高了資源的利用率和系統的吞吐量 程序的非同步性 會給系統造成混亂 程序同步基本概念 1,兩種形式的制約關係 a 間接相互制約 ab兩程序爭用一台印表機 b 直接相互制約 a程序放資料 緩衝區 b程序從緩衝區取資料 2,臨界資源 硬體臨界資源 軟體臨界資源 印表機,磁帶機,緩衝區。3,臨界...