生产者 - 消费者及其运作方式

时间:2013-10-04 16:49:40

标签: mutex producer-consumer

使用信号量解决后,有人能向我解释生产者 - 消费者问题吗?更具体地说,我很难理解在生产者代码和消费者中,当起伏的顺序发生变化时会发生什么。

semaphore mutex = 1;
semaphore full = 0;
semaphore empty = N;

void producer (void){
{
while(true)
{
int item = produce_item();
down(&empty);
down(&mutex);
insert_item(item);
up(&mutex);
up(&full);
}
}

void consumer (void){
{
while(true)
{
down(&full);
down(&mutex);
int item = remove_item(item);
up(&mutex);
up(&empty);
consume_item(item);
}
}

是我或多或少谈论的代码。

1 个答案:

答案 0 :(得分:2)

它看起来像是使用忙碌等待实现的信号量。

它的工作原理如下:

生产者和消费者彼此并行工作。 互斥是互斥的。这意味着,只有其中一个同时访问incommon数据结构。 down()检查互斥锁是否空闲(在这种情况下== 1)。它在while循环中检查这个:while (mutex < 1);。如果互斥锁最终是空闲的,则会降低其值(称为“取互斥锁”)。

另外两个信号量用于确定两件事:

  1. 如果数据结构不为空,则消费者只能消费
  2. 如果数据结构不满,则生产者只能生产
  3. 这是必要的,因为其中一个可能比另一个更快。

    使用down(&empty);生产者检查数据结构中是否有空槽。如果不是这种情况,则不允许他生产(忙于等待插槽空闲,意味着空&gt; 0)。否则他会减空而继续。 当他在数据结构中添加他生产的项目时,他用up(&full);增加了完整位置的值。

    使用down(&full);消费者检查是否有完整的插槽要读取。如果不是这种情况,则不允许他阅读(忙等待直到插槽已满,意味着完全> 0)。否则他会减少并继续。 当他从数据结构中消耗他的项目时,他增加了空位的值。

    改变起伏的顺序可能会导致死锁,因为他们可能会无限期地等待彼此。