对生产者消费者信号量订单的一个小改动

时间:2018-06-04 18:23:12

标签: algorithm concurrency producer-consumer

这是典型的生产者消费者问题解决方案:

semaphore mutex = 1
semaphore fillCount = 0
semaphore emptyCount = BUFFER_SIZE

procedure producer() {
    while (true) {
        item = produceItem()
        down(emptyCount)
            down(mutex)
                putItemIntoBuffer(item)
            up(mutex)
        up(fillCount)
    }
}

procedure consumer() {
    while (true) {
        down(fillCount)
            down(mutex)
                item = removeItemFromBuffer()
            up(mutex)
        up(emptyCount)
        consumeItem(item)
    }
}

我的问题是,如果我们在消费者或生产者中交换最后两个信号量顺序会产生什么影响?

例如,如果消费者的代码变为:

procedure consumer() {
    while (true) {
        down(fillCount)
            down(mutex)
                item = removeItemFromBuffer()
        up(emptyCount)
            up(mutex)
        consumeItem(item)
    }
}

1 个答案:

答案 0 :(得分:3)

在这个简单的例子中,结果是相同的,你不会遇到饥饿或死锁(即使第二版consumer绝对是一个坏习惯)。

考虑一个更复杂的情况(不应该发生)你有错误的消费者,并且你在up(emptyCount)up(mutex)之间有一些代码,如下所示:

up(emptyCount)
// time-consuming code
up(mutex)

在这种情况下,您可能会有更多producer等待释放mutex,这是不必要的。 现在考虑更糟糕的情况,你必须在这两条指令之间处理另一个信号量:在最坏的情况下,它可能导致饥饿。