给定条件变量的典型例子
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/