以下是Galvin 等人给出的操作系统概念的生产者-消费者问题的伪代码。人。
我们假设池由
n
缓冲区组成,每个缓冲区都可以容纳一个项目。互斥二进制信号量为对缓冲池的访问提供互斥,并初始化为 value1
。
//initialization
int n;
semaphore mutex = 1;
semaphore empty = n;
semaphore full = 0;
下面是生产者结构的伪代码:
while (true)
{
. . .
/* produce an item in next_produced */
. . .
wait(empty);
wait(mutex);
. . .
/* add next produced to the buffer */
. . .
signal(mutex);
signal(full);
}
下面是消费者结构的伪代码:
while (true)
{
wait(full);
wait(mutex);
. . .
/* remove an item from buffer to next_consumed */
. . .
signal(mutex);
signal(empty);
. . .
/* consume the item in next consumed */
. . .
}
以上是就正文而言。让我更进一步,包括缓冲区的工作。让char buffer[n]
成为充当缓冲区的两个进程之间的共享数组。所以我们有:
/*Structure of the producer- elaborated by me*/
int i=0;
while (true)
{
. . .
/* produce an item in next_produced */
. . .
wait(empty);
//wait(mutex);
. . .
buffer[i]=next_produced;
/* add next produced to the buffer */
i=(i+1)%n;
. . .
//signal(mutex);
signal(full);
}
/*Structure of the consumer elaborated by me*/
int i=0;
while (true)
{
wait(full);
//wait(mutex);
. . .
next_consumer=buffer[i];
/* remove an item from buffer to next_consumed */
i=(i+1)%n;
. . .
//signal(mutex);
signal(empty);
. . .
/* consume the item in next_consumed */
. . .
}
尽管文本在访问缓冲区之前使用了互斥锁(根据他们的逻辑,由于缓冲区是共享项,因此应该以互斥方式访问),但我认为在访问缓冲区时使用互斥锁并不是绝对必要的。缓冲区元素,因为生产者和消费者虽然可以同时访问缓冲区,但我猜他们永远不能同时访问相同的buffer
数组位置。由于他们不能同时访问同一个位置,因此不可能出现竞争条件......
这就是我的感受。如果我错了,请纠正我。也请指出我犯错误的部分。谢谢你。