维基百科针对多生产者-消费者问题的solution使用互斥量和信号量。
mutex buffer_mutex;
semaphore fillCount = 0;
semaphore emptyCount = BUFFER_SIZE;
procedure producer()
{
while (true)
{
item = produceItem();
down(emptyCount);
down(buffer_mutex);
putItemIntoBuffer(item);
up(buffer_mutex);
up(fillCount);
}
}
procedure consumer()
{
while (true)
{
down(fillCount);
down(buffer_mutex);
item = removeItemFromBuffer();
up(buffer_mutex);
up(emptyCount);
consumeItem(item);
}
}
使用互斥量的原因是,当多个生产者和消费者位于关键部分时,强制执行互斥。我的问题是,既然目标始终是在关键部分有一个 single 线程,为什么不只使用二进制信号量来确保这一点呢?也就是说,如果在该示例中使用二进制信号量,是否可以取消互斥锁?