经典的进程同步问题-生产者消费者问题

生产者消费者问题

问题描述是:有一群生产者进程在生产产品,此产品提供给消费者去消费。为使生产者和消费者进程能并发执行,在它们之间设置一个具有n个缓冲池,生产者进程可将它所生产的产品放入一个缓冲池中,消费者进程可从一个缓冲区取得一个产品消费。

semaphore mutex=1,empty=n,full=0;
item buffer[n];   //缓冲区
int in=out=0;   //输入、输出指针
void producer()  

{    


    do{    
         …
         生产一个产品nextp;
        …
        wait(empty);  //首先对empty--判断他是否小于0,小于0就自我阻塞(相当于看是否有空位子)
        wait(mutex);  //拿到锁,否则就自我阻塞   

        buffer[in]= nextp; //往Buffer [in]放产品
        in = (in+1) % n;
        signal(mutex);  //释放锁
        signal(full);   //对full++判断是否<=0,如果是就唤醒进程

   }while(true)
}

void consumer()  
{    
    
    do{   ……
        wait(full); //首先对full--判断他是否小于0,小于0就自我阻塞(相当于看是否有产品可以消费)
        wait(mutex); //拿到锁,否则就自我阻塞
        nextc = buffer[out]; //从Buffer [out]取产品
        out = (out +1) mod n;
        signal(mutex); //释放锁
        signal(empty); //对empty++判断是否<=0,如果是就唤醒进程
                                   消费nextc产品;
      }while(true)
}

main()
{
    cobegin{
    producer();
    consumer();
}

//wait(x)是把x这个信号量进入临界区,
signal(y)是把y这个信号量离开临界区。
注意:如果wait(full),wait(mutex)互换位置就会发生死锁

猜你喜欢

转载自blog.csdn.net/wyf2017/article/details/80009790