我已经阅读了大量使用信号量的生产者 - 消费者问题,但我无法找到这个问题的答案。我想知道的是,这个解决方案是否会陷入僵局?
semaphore loadedBuffer = 0
semaphore emptyBuffer = N where n>2
semaphore mutex = 1
Producer(){
P(emptyBuffers)
P(mutex)
//load buffer
V(loadedBuffers)
v(mutex)
Consumer(){
P(loadedBuffer)
P(mutex)
//empty buffer
V(mutex)
v(emptyBuffer)
我相信这是一个很好的解决方案,因为我无法找到这种情况会导致死锁的情况,因为只要使用互斥信号量,线程就不可能等待其他任何事情。
我认为这是一个很好的解决方案并且永远不会陷入僵局,我是否正确?
答案 0 :(得分:0)
您的算法中P()
,V()
和v()
的含义并不十分清楚,但通常您只需要两个信号量,如维基百科中所述:
semaphore fillCount = 0; // items produced
semaphore emptyCount = BUFFER_SIZE; // remaining space
procedure producer()
{
while (true)
{
item = produceItem();
down(emptyCount);
putItemIntoBuffer(item);
up(fillCount);
}
}
procedure consumer()
{
while (true)
{
down(fillCount);
item = removeItemFromBuffer();
up(emptyCount);
consumeItem(item);
}
}
来源:https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem#Using_semaphores