1. 程式人生 > >經典程序的同步問題:生產者-消費者問題

經典程序的同步問題:生產者-消費者問題

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;
}