生產者消費者問題 讀者寫者問題,理髮師問題

2021-10-01 14:25:17 字數 1525 閱讀 9728

定義:

生產者消費者問題(英語:producer-consumer problem),也稱有限緩衝問題(英語:bounded-buffer problem),是乙個多執行緒同步問題的經典案例。該問題描述了共享固定大小緩衝區的兩個執行緒——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。

訊號量解決方法:

item b[k]

;//k個緩衝區

semaphore empty=k,full=

0,metux=1;

//空的和滿的緩衝區的個數,以及互斥訊號量

int in=

0,out=0;

//指標

cobegin

process producer_i()

} coend

cobegin

process consumer_i()

}

讀者寫者問題

「讀者—寫者」問題—記錄型訊號量

乙個資料檔案或記錄可被多個程序共享。

只要求讀檔案的程序稱為「reader程序」,其它程序則稱為「writer程序」。

允許多個程序同時讀乙個共享物件,但不允許乙個writer程序和其他reader程序或writer程序同時訪問共享物件

「讀者—寫者問題」是保證乙個writer程序必須與其他程序互斥地訪問共享物件的同步問題。

對於乙個檔案,同一時間允許多個讀者讀,只允許乙個寫者寫。

int count=0;

//在讀的個數

semaphore mutex=

1,writeblock=1;

//二元訊號量,和讀者鎖

cobegin

process reader_i()

p(mutex)

; count--;if

(count==0)

v(writeblock);v

(mutex);}

cend

cobegin

process writer_i()

v(writeblock);}

coend

1、沒有顧客,理髮師睡覺

2、某位顧客到來,顧客必須叫醒理髮師

3、如果顧客到來後,理髮師在理髮,如果有空椅子,等待,沒有的話,離開。

int waiting=

0,chair=n;

//等待的顧客數

semaphore customers=

0,babres=

0,mutex=1;

cobegin

proecss baber()

}coend

cobegin

process customer()

else

v(mutex)

;}

生產者消費者問題

public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...

生產者 消費者問題

在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...

生產者 消費者問題

1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...