gpt4 book ai didi

c++ - 使用互斥量作为条件变量

转载 作者:搜寻专家 更新时间:2023-10-31 00:03:19 25 4
gpt4 key购买 nike

给定条件变量的典型例子

pthread_mutex_lock(&count_mutex);
pthread_cond_wait(&count_threshold_cv, &count_mutex);

然后我可以从另一个线程发送信号,这个线程将继续。

但我看不出仅仅尝试锁定互斥锁有什么问题,如果锁被占用,那么线程将等待互斥锁被释放。

这种方法的唯一问题是不断轮询吗?

谢谢

最佳答案

让我们具体化。您建议的条件变量替代方案是让“服务员”执行此操作:

loop:
lock mutex
check predicate
if (predicate is false)
unlock mutex
sleep a bit // (is this what you had in mind?)
goto loop

对于“信号员”来说:

    lock mutex
make predicate true
unlock mutex

在这里,“谓词”可能是“队列不为空”,例如。

这种方法有两个问题。第一个是您确定的那个:持续轮询效率低下。如果您想象整个系统中有成百上千个线程试图以这种方式运行,那么系统就会崩溃。或者你的“睡一会儿”必须很长,以至于 sleep 本身会增加恼人的延迟。

第二个问题更微妙。无法保证当一个线程解锁一个互斥量然后再次锁定它时,另一个等待该互斥量的线程将被允许运行。 (互斥锁的这个属性被称为“公平”;提供它的互斥锁被称为“公平”。POSIX 要求互斥锁是公平的。)无论你在“服务员”,无法保证“信号员”将永远通过其lock mutex 调用。

条件变量解决了这两个问题。

关于c++ - 使用互斥量作为条件变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6379443/

25 4 0