經典程序的同步問題:生產者-消費者問題
阿新 • • 發佈:2018-11-22
1.生產者-消費者問題
假定在生產者和消費者之間的公用緩衝池中具有n個緩衝區,消費者不能同時取一個緩衝區的產品,生產者不能同時向同一個緩衝區放入產品。只有緩衝區中有產品時,消費者才可以取產品,只有緩衝區有空時,生產者才可以放入產品。消費者與生產者也不能同時對同一個緩衝區進行操作。
int in=0,out=0; item buffer[n]; semaphore mutex=1,empty=n,full=0;//empty代表緩衝池中的空的數量,full代表緩衝池中的產品數 void producer(){//生產者 do{ producer an item nextp; ... wait(empty);//緩衝池是否為空,如果有空就繼續進行,否則阻塞 wait(mutex);//實現生產者消費者之間的互斥 buffer[in]=nextp; in=(in+1)%n; signal(mutex); signal(full);//釋放產品的數量 }while(TRUE); } void consumer(){ do{ wait(full);//判斷是否有產品 wait(mutex); //取產品 nextc=buffer[out]; out=(out+1)%n; signal(mutex); signal(empty); ... }while(TRUE) } void main(){ cobegin proceder(); consumer(); coend; }
,此方法需要連續申請兩個訊號量,所以有可能只申請了一個訊號量,就被中斷,可能會造成死迴圈,解決方法時使用AND訊號量。
int in=0,out=0; item buffer[n]; semaphore mutex=1,empty=n,full=0;//empty代表緩衝池中的空的數量,full代表緩衝池中的產品數 void producer(){//生產者 do{ producer an item nextp; ... Swait(empty,mutex);//同時申請兩個訊號量 buffer[in]=nextp; in=(in+1)%n; signal(mutex); signal(full);//釋放產品的數量 }while(TRUE); } void consumer(){ do{ Swait(full,mutex); //取產品 nextc=buffer[out]; out=(out+1)%n; signal(mutex); signal(empty); ... }while(TRUE) } void main(){ cobegin proceder(); consumer(); coend; }