程序同步問題

2021-08-06 07:04:37 字數 1581 閱讀 8085

有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生***,但若某個寫程序和其他程序(讀程序或寫程序)同時訪問共享資料時則可能導致資料不一致的錯誤。

因此要求:

①允許多個讀者可以同時對檔案執行讀操作;

②只允許乙個寫者往檔案中寫資訊;

③任一寫者在完成寫操作之前不允許其他讀者或寫者工作;

④寫者執行寫操作前,應讓已有的讀者和寫者全部退出。

1) 關係分析。由題目分析讀者和寫者是互斥的,寫者和寫者也是互斥的,而讀者和讀者不存在互斥問題。

2) 整理思路。兩個程序,即讀者和寫者。寫者是比較簡單的,它和任何程序互斥,用互斥訊號量的p操作、v操作即可解決。讀者的問題比較複雜,它必須實現與寫者互斥的同時還要實現與其他讀者的同步,因此,僅僅簡單的一對p操作、v操作是無法解決的。那麼,在這裡用到了乙個計數器,用它來判斷當前是否有讀者讀檔案。當有讀者的時候寫者是無法寫檔案的,此時讀者會一直占用檔案,當沒有讀者的時候寫者才可以寫檔案。同時這裡不同讀者對計數器的訪問也應該是互斥的。

3) 訊號量設定。首先設定訊號量count為計數器,用來記錄當前讀者數量,初值為0; 設定mutex為互斥訊號量,用於保護更新count變數時的互斥;設定互斥訊號量rw用於保證讀者和寫者的互斥訪問。

int count=0;  //用於記錄當前的讀者數量

semaphore mutex=1; //用於保護更新count變數時的互斥

semaphore rw=1; //用於保證讀者和寫者互斥地訪問檔案

writer ()

}reader ()

}

假設乙個系統有三個抽菸者程序和乙個**者程序。每個抽菸者不停地捲菸 並抽掉它,但是要捲起並抽掉一支煙,抽菸者需要有三種材料:菸草、紙和膠水。三個抽菸 者中,第乙個擁有菸草、第二個擁有紙,第三個擁有膠水。**者程序無限地提供三種材料, **者每次將兩種材料放到桌子上,擁有剩下那種材料的抽菸者卷一根煙並抽掉它,並給供 應者乙個訊號告訴完成了,**者就會放另外兩種材料在桌上,這種過程一直重複。

1) 關係分析。**者與三個抽菸者分別是同步關係。由於**者無法同時滿足兩個或 以上的抽菸者,三個抽菸者對抽菸這個動作互斥。

2) 整理思路。顯然這裡有四個程序。**者作為生產者向三個抽菸者提供材料。

3) 訊號量設定。訊號量offer1、offer2、offer3分別表示菸草和紙組合的資源、菸草和 膠水組合的資源、紙和膠水組合的資源。訊號量finish用於互斥進行抽菸動作。

int random; //儲存隨機數

semaphore offer1=0; //定義訊號量對應菸草和紙組合的資源

semaphore offer2=0; //定義訊號量對應菸草和膠水組合的資源

semaphore offer3=0; //定義訊號量對應紙和膠水組合的資源

semaphore finish=1; //定義訊號量表示抽菸是否完成

//**者

while(1)

//擁有菸草者

while(1)

//擁有紙者

while(1)

//擁有膠水者

while(1)

經典程序同步問題

文章出處 http heikediguo2005.blog.163.com blog static 2211971200910254235533 依據訊號量與程序的關係,我們可把程序中使訊號量分成私用訊號量和公用訊號量。私有訊號量是指只與制約程序和被制約程序有關的訊號量 公用訊號量是指與一組併發程序...

執行緒 程序同步問題

計算機網路課程實驗要做乙個c s模型的檔案傳遞程式。本來socket程式設計我還是比較熟悉的,因為以前用vc mfc編過乙個網路遊戲 網路五子棋,並通過設定nat與新加坡的同學對戰了一把。這次的程式本來更簡單,但是老師要用純windows api來寫,不准用其他的類庫,於是工作的重點就轉移到了怎樣構...

經典程序同步問題

wait表示為訊號量減一,當訊號量不夠減時 訊號量 0 時 說明當前資源不足,發出資源請求的程序阻塞直到資源可達。signal 表示為訊號量加一,表示釋放了當前訊號量所指代的資源。兩者都是原子操作,不可打斷。生產者不停的向訊息佇列中生產訊息,消費者則不停的從訊息佇列中獲取訊息。當訊息佇列滿時,生產者...