0

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

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);
}
}

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

4

1 回答 1

2

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

它的工作原理如下:

生产者和消费者彼此并行工作。互斥体用于互斥。这意味着,其中只有一个同时访问不常见的数据结构。down() 正在检查互斥锁是否空闲(在本例中为 == 1)。它在一个while循环中检查这个,比如:while (mutex < 1);。如果互斥锁最终是空闲的,它会减小它的值(称为“获取互斥锁”)。

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

  1. 如果数据结构不为空,消费者只能消费
  2. 如果数据结构不完整,生产者只能生产

这是必要的,因为两者中的一个可能比另一个更快。

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

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

改变起起落落的顺序可能会导致僵局,因为它们可能会无限期地等待对方。

于 2013-10-04T17:11:11.423 回答