生产者消费者问题是同步问题。有一个固定大小的缓冲区,生产者生产商品并将其输入缓冲区。消费者从缓冲区中删除项目并消费它们。
当消费者从缓冲区中消费商品时,生产者不应将商品生产到缓冲区中,反之亦然。因此,缓冲区只能一次由生产者或使用者访问。
生产者消费者问题可以使用信号量解决。生产者和消费者过程的代码如下:
下面给出了定义生产者流程的代码-
do { . . PRODUCE ITEM . wait(empty); wait(mutex); . . PUT ITEM IN BUFFER . signal(mutex); signal(full); } while(1);
在上面的代码中,互斥,空和满是信号量。此处互斥锁初始化为1,empty初始化为n(缓冲区的最大大小),full初始化为0。
互斥信号量确保相互排斥。空和满信号量计算缓冲区中的空和满空间数量。
物料生产后,对空物料进行等待操作。这表明缓冲区中的空白空间已减少了1。然后对互斥量执行等待操作,以使使用者进程不会受到干扰。
将项目放入缓冲区后,对互斥锁和满载进行信号操作。前者指示使用者进程现在可以执行,而后者指示缓冲区已满1。
下面给出了定义使用者流程的代码:
do { wait(full); wait(mutex); . . . REMOVE ITEM FROM BUFFER . signal(mutex); signal(empty); . . CONSUME ITEM . } while(1);
等待操作完全执行。这表明缓冲区中的项减少了1。然后对互斥量执行等待操作,以使生产者过程不会干扰。
然后将该项目从缓冲区中删除。之后,对互斥锁和空寄存器执行信号操作。前者指示使用者进程现在可以起作用,而后者指示缓冲区中的空白空间增加了1。