作業系統實驗 同步互斥

2021-06-15 18:13:35 字數 4647 閱讀 3660

實習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年...