生产者消费者模型(为什么使用两个信号量?)

来源:互联网 发布:c语言数组教程 编辑:程序博客网 时间:2024/05/22 08:25


生产者消费者模型中需要2个信号量,1个互斥量。大致过程如下:

P操作:

            申请资源,S=S-1。如果S>0,则继续。否则线程阻塞,放入等待队列。

V操作:

            释放资源,S=S+1。如果S>0,则继续。否则唤醒等待队列中的第一个线程。

Semaphore empty(N), full(0);

Mutex mutex;

producer

{

            empty.require();           //P操作,试图获取可用的空buffer

            mutex.require();

            //          … insert data to buffer;

            mutex.release();

            full.release();   //V操作,通知有新的存有数据的buffer可用

}

consumer

{

            full.require();   // P操作,试图获取可用的存有数据的buffer

            mutex.require();

            //          …get date from buffer

            mutex.release();

            empty.release();           // V操作,通知有新的空buffer可用。

}

 

为什么要用两个信号量,使用一个是否可以?

            不可以。因为producer & consumer模型中认为buffer是有限的。只用一个信号量,无法做到当资源耗尽时,让producer或者consumer线程都能挂起。对于producer资源耗尽指没有空buffer可用,对于consumer资源耗尽指没有存有数据的buffer可用。

比如producer生产一个数据则信号量增加,consumer消耗一个数据则信号量递减,似乎可以?其实不对,试想producer线程永远不会挂起(即便consumer从不消耗资源),显然不满足buffer有限的条件。