經典程序同步與互斥問題

2021-09-11 08:54:36 字數 1042 閱讀 8081

二、讀者與寫者問題

三、哲學家進餐過程

設定3個訊號量:mutex=1,full=0,empty=n(假設緩衝池大小為n)

p(empty)

p(mutex)

寫入資料

v(mutex)

v(full)

p(full)

p(mutex)

讀取資料

v(mutex)

v(empty)

乙個資料物件(如檔案、記錄)可以被多個程序共享。這些程序可以分為兩類:

這類問題具有以下特點:

讀者程序之間不互斥

寫者與寫者、寫者與讀者之間互斥

設定3個訊號量:mutex,readercount,writer

p(mutex)

//臨界區沒有讀者時,先判斷當前臨界區是否有寫者程序

//由第乙個進入臨界區的讀者程序來阻塞後來的寫者程序

if(readercount == 0)

p(writer);

//當此時臨界區已經存在讀者程序時,countreader++

++readercount;

v(mutex)

讀資料p(mutex)

--readercount;

//由最後乙個離開臨界區的讀者程序喚醒可能被阻塞的寫者程序

if(readercount == 0)

v(writer);

v(mutex)

p(writer)

寫資料v(writer)

五個哲學家,他們的生活方式是交替地進行思考和進餐。哲學家們共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五個碗和五支筷子。

對於上述問題,很容易想到這樣一種方法:設定乙個互斥訊號量陣列,第i個哲學家進餐時,分別p(mutex[i-1])和p(mutex[i])。

while(1)
但是上述方法很容易引起死鎖。為了解決死鎖問題,可以考慮以下方法:

經典程序同步與互斥問題

1.1 簡單的 生產者 消費者 問題 設程序a b是兩個相互合作的程序,它們共享乙個緩衝區,程序a向其中寫入資料,程序b從中讀出資料。producer 生產者程序,consumer 消費者程序。當緩衝區不空時,消費者便可以讀資料 當緩衝區為空時,生產者便可以寫資料。設定訊號量 full 表示有資料緩...

程序同步與互斥

程序同步與互斥 首先,我們看乙個例子 程序p1 p2公用乙個變數count,初始值為0 p1 p2兩個程序的執行順序是隨機的,p1 p2可能順序執行或交錯執行。由圖可見,不同的執行順序,count值會不同,這是不允許的。在多道程式系統中,由於資源共享或程序合作,使程序間形成間接相互制約和直接相互制約...

程序同步與互斥

為什麼要引入程序同步的概念?多道程式環境下的程序併發執行,它們相互之間存在著不同的制約關係,為了理解和協調這種制約的關係,引入了程序同步的概念。臨界資源是一次只能為乙個程序使用的資源。由於臨界資源的特性,就決定了 對它的訪問必須是互斥的。在每個程序中,訪問臨界資源的那段 稱為臨界區。為了保證臨界資源...