gpt4 book ai didi

multithreading - 生产者使用者同步只有1个信号量

转载 作者:行者123 更新时间:2023-12-03 12:54:06 25 4
gpt4 key购买 nike

Producer-Consumer problem中,标准解决方案使用3个信号量。
但是,我想知道我们是否只能使用1个信号量:

semaphore mutex = 1

procedure producer() {
while (true) {
down(mutex)
if (bufferNotFull()) {
item = produceItem()
putItemIntoBuffer(item)
}
up(mutex)
}
}

procedure consumer() {
while (true) {
down(mutex)
if (bufferNotEmpty()) {
item = removeItemFromBuffer()
consumeItem(item)
}
up(mutex)
}
}

此解决方案是否与标准解决方案一样好?

标准解决方案供引用:
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()
consumeItem(item)
up(mutex)
up(emptyCount)
}
}

最佳答案

“标准解决方案”不必使用3个信号量。对于您只有一个生产者和一个消费者的情况,即使您链接的Wikipedia文章也有两种信号量解决方案:

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);
}
}
具有单个信号量的解决方案并不是很好,因为它们在您实际需要时仅给您一个等待条件-“等待可用空间”和“等待项目”。您不能使用一个信号量来做到这两者。
无论如何,您的解决方案都没有错,它的效率非常低,因为在任何给定时刻,只有一个生产者或一个消费者都可以运行。这本质上是单线程代码,仅在线程之间具有锁和上下文切换。因此,它比实际的单线程代码效率更低。
还有一件事-物品的生产和消费通常不是关键部分的一部分。在消耗或生产商品时,其他线程可以运行。仅在使用缓冲区时,我们才需要互斥。

关于multithreading - 生产者使用者同步只有1个信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57496477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com