定義:
生產者消費者問題(英語: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(){//生產者進程
while(1){
produec();//生產產品
P(empty);//對空信號量進行操作
P(mutex);
append to B[in];
in=(in+1)%k;//向緩衝區中放置一個
V(mutex);
V(full);//對滿信號量操作
}
}
coend
cobegin
process consumer_i(){//消費者進程
while(1){
P(full);//對滿信號量操作
P(mutex);
take from B[out];
out=(out+1)%k;//從緩衝區中取走一個
V(mutex);
V(empty);//對空信號量操作
consume();
}
}
讀者寫者問題
“讀者—寫者”問題—記錄型信號量
一個數據文件或記錄可被多個進程共享。
只要求讀文件的進程稱爲“Reader進程”,其它進程則稱爲“Writer進程”。
允許多個進程同時讀一個共享對象,但不允許一個Writer進程和其他Reader進程或Writer進程同時訪問共享對象
“讀者—寫者問題”是保證一個Writer進程必須與其他進程互斥地訪問共享對象的同步問題。
對於一個文件,同一時間允許多個讀者讀,只允許一個寫者寫。
int count=0;//在讀的個數
semaphore mutex=1,writeblock=1;//二元信號量,和讀者鎖
cobegin
process reader_i(){
P(mutex);
count++;
if(count==1) P(writeblock);
V(mutex);
{讀文件}
P(mutex);
count--;
if(count==0)V(writeblock);
V(mutex);
}
cend
cobegin
process writer_i(){
P(writeblock);
{寫操作}
V(writeblock);
}
coend
理髮師睡眠問題:
1、沒有顧客,理髮師睡覺
2、某位顧客到來,顧客必須叫醒理髮師
3、如果顧客到來後,理髮師在理髮,如果有空椅子,等待,沒有的話,離開。
int waiting=0,chair=n;//等待的顧客數
semaphore customers=0,babres=0,mutex=1;
cobegin
proecss baber(){
while(1){
P(customers);
P(mutex);
waiting--;
V(babres);//理髮師喊來顧客理髮
V(mutex);
}
}
coend
cobegin
process customer(){
P(mutex);
if(waiting<chairs){
waiting++;
V(customers);
V(mutex);
P(barbres);
get_haircut();
}else V(mutex);
}