實習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
5 w 5.1 3
與實驗相關的api介紹
在本實驗中可能涉及的api 有:
執行緒控制:
createthread 完成執行緒建立,在呼叫程序的位址空間上建立乙個執行緒,以執行指定的函
數;它的返回值為所建立執行緒的控制代碼。
handle createthread(
lpsecurity_attributes lpthreadattributes, // sd
dword dwstacksize, // initial stack size
lpthread_start_routine lpstartaddress, // thread
function
lpvoid lpparameter, // thread argument
dword dwcreationflags, // creation option
lpdword lpthreadid // thread identifier
);exitthread 用於結束當前執行緒。
void exitthread(
dword dwexitcode // exit code for this thread
);sleep 可在指定的時間內掛起當前執行緒。
void sleep(
dword dwmilliseconds // sleep time
);訊號量控制:
createmutex 建立乙個互斥物件,返回物件控制代碼;
handle createmutex(
lpsecurity_attributes lpmutexattributes, // sd
bool binitialowner, // initial owner
lpctstr lpname // object name
);openmutex 開啟並返回乙個已存在的互斥物件控制代碼,用於後續訪問;
handle openmutex(
dword dwdesiredaccess, // access
bool binherithandle, // inheritance option
lpctstr lpname // object name
);releasemutex 釋放對互斥物件的占用,使之成為可用。
bool releasemutex(
handle hmutex // handle to mutex
);waitforsingleobject 可在指定的時間內等待指定物件為可用狀態;
dword waitforsingleobject(
handle hhandle, // handle to object
dword dwmilliseconds // time-out interval
);實驗程式**
#include
#include
#include
#include
#include
#include
#definemax_person100
#definereader0
#definewriter1
#defineend-1
#definer
reader
#definewwriter
typedef struct _person
person;
person g_persons[max_person];
intg_numperson = 0;
longg_currenttime= 0;
intg_personlists = ;
intg_numofreading = 0;
handle g_hreadmutex;
handle g_hwritemutex;
voidcheckpersonlist(int *ppersonlist);
boolcreatereader(int starttime,int worktime);
boolcreatewriter(int starttime,int worktime);
dwordwinapireaderproc(lpvoid lpparam);
dwordwinapiwriterproc(lpvoid lpparam);
int main()
return 0;
}void checkpersonlist(int *ppersonlists)
if(!ret)
printf("create person %d is wrong/n",plist[0]);
}plist += 4; // move to next person list}}
dwordwinapi readerproc(lpvoid lpparam)
g_numofreading++;
releasemutex(g_hreadmutex);
printf("reader %d is request ok/n",pperson->m_nid);
// 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_hreadmutex,infinite);
g_numofreading--;
if(g_numofreading == 0)
releasemutex(g_hwritemutex);
releasemutex(g_hreadmutex);
exitthread(0);
return 0;
}dwordwinapi writerproc(lpvoid lpparam)
printf("writer %d is exit.../n",pperson->m_nid);
releasemutex(g_hwritemutex);
exitthread(0);
return 0;
}bool createreader(int starttime,int worktime)
bool createwriter(int starttime,int worktime)
關於同步互斥的api**
windows api裡面有兩個方法可以實現同步互斥,乙個是createmutex建立互斥訊號,另外乙個是
createsemaphore建立一般訊號量.上面的程式是實現一般的讀者寫者的同步互斥問題,按理來說使用mutex是比較的選擇,可是實際上面的程式執行的結果發現,當建立mutex的執行緒結束後,其mutex就自動釋放(解開),即使這個時候沒有使用releasemutex函式.然後老師叫我使用createsemaphore來實現,測試發祥,使用semaphore就沒有這個問題.不知道這個問題是不是windows系統故意這樣設計的.
關於windows實現的同步互斥的詳細api介紹,請檢視
作業系統 同步與互斥問題
1.生產者 消費者問題 define n 100 有界緩衝區大小 typedef int semaphore 定義訊號量 semaphore mutex 1 臨界區互斥訊號量 semaphore empty n 空閒緩衝區 semaphore full 0 緩衝區初始化為空 void produce...
作業系統 併發 互斥與同步
在多道程式設計系統種,程序會被交替執行,進而在巨集觀上表現出一種併發的外部特徵。為什麼需要併發?假設乙個支援單使用者的單處理器多道程式設計系統,使用者可以從乙個應用程式切換到另乙個應用程式,每個應用程式都使用同一鍵盤輸入,使用同一鍵盤輸出。由於每個程式都需要使用某乙個輸入輸出過程,所以將他視為乙個共...
程序互斥與同步計算機作業系統 作業系統同步互斥大題
作業系統程序同步互斥問題 pv操作加訊號量來實現程序的同步互斥 解題步驟 首先要分析題目中近程的同步關係和互斥關係 同步關係用前v後p實現 互斥關係,一般都是對於乙個緩衝區或者本質上是緩衝區的變數進行訪問,這時候就要用pv操作將對於這個訊號量的訪問夾在中間 解題精髓就這兩句 下面以408 2009年...