生产者消费者问题

问题描述:设有n个缓冲区,一组生产者进程往缓冲区写数据,一组消费者进程从缓冲区取数据,写取以一个缓冲区为单位。

说明:

      将缓冲池看作是共享数据,对缓冲区的操作必须是互斥操作。
      如果n个缓冲区全满,生产者进程必须等待。
      如果缓冲区全空,消费者进程必须等待。
设置以下信号量
   互斥: mutex,初值为1,控制互斥访问缓冲池。
   同步: full,初值为0,表示当前缓冲池中满缓冲区数。
              empty,初值为N,表示当前缓冲池中空缓冲区数。
生产者消费者问题_第1张图片
有限缓冲区问题解决:
main(){
int mutex=1;
int empty=n;
int full=0;
Cobegin
P1();
p2();
Coend
}
生产者与消费者的同步关系:
生产者:当有界缓冲区中无空位置时,要等待;

              向有界缓冲区放入物品后,要发消息;
消费者:当有界缓冲区中无物品时,要等待;
              从有界缓冲区取出物品后,要发消息;
//进程P1:
p1()
{
         while(生产未完成)
         {
            ...
            p(empty);
            p(mutex);
            送一个产品到有界缓冲区:
            v(mutex);
            v(full);
            }
}

//进程P2:
P2()
{
        while(还要继续消费)
        {
            p(full);
            p(mutex);
            从有界缓冲区中取产品:
            v(empty);
            v(mutex);
            消费一个产品:
            ...
          }
}

           特别注意,无论是在消费者还是生产者进程中,V操作的次序无关紧要,但两个P操作的次序却不能颠倒,否则可能导致死锁:empty为0,full为n时,易发生死锁:生产者见到mutex为绿灯后进入,将mutex置为红灯;此时empty为0,则等待,这时消费者无法进入消费(mutex为红灯)。                     

 

你可能感兴趣的:(生产者消费者问题)