这种具有信号量的生产者 - 消费者场景是否会陷入僵局?

时间:2018-02-05 19:01:58

标签: deadlock semaphore producer-consumer

我已经阅读了大量使用信号量的生产者 - 消费者问题,但我无法找到这个问题的答案。我想知道的是,这个解决方案是否会陷入僵局?

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)

我相信这是一个很好的解决方案,因为我无法找到这种情况会导致死锁的情况,因为只要使用互斥信号量,线程就不可能等待其他任何事情。

我认为这是一个很好的解决方案并且永远不会陷入僵局,我是否正确?

1 个答案:

答案 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