【问题标题】:using a mutex as a condition variable使用互斥锁作为条件变量
【发布时间】:2023-03-10 06:36:01
【问题描述】:
给定条件变量的规范示例
pthread_mutex_lock(&count_mutex);
pthread_cond_wait(&count_threshold_cv, &count_mutex);
然后我可以从另一个线程发送一个信号,这个线程将继续。
但是我看不出仅仅尝试锁定互斥锁有什么问题,如果锁被占用,那么线程将等待互斥锁被释放。
这种方法的唯一问题是不断轮询吗?
谢谢
【问题讨论】:
标签:
c++
c
multithreading
pthreads
【解决方案1】:
让我们把它具体化。您建议的条件变量替代方法是让“服务员”这样做:
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
例如,这里的“谓词”可能是“队列不为空”。
这种方法有两个问题。第一个是您确定的:持续轮询效率低下。如果您想象整个系统中成百上千的线程试图以这种方式运行,那么它会使系统陷入瘫痪。或者你的“睡一会”必须很长,以至于睡眠本身会增加烦人的延迟。
第二个问题更微妙。不能保证当一个线程解锁一个互斥体然后再次锁定它时,另一个等待该互斥体的线程将被允许运行。 (互斥锁的这个属性称为“公平”;提供它的互斥锁被称为“公平”。POSIX 确实不要求互斥锁是公平的。)无论您在“服务员”,无法保证“信号员”永远通过其lock mutex 呼叫。
条件变量解决了这两个问题。
【解决方案2】:
条件变量表示对受互斥体保护的数据结构的更改。例如。您可能有一个受互斥体保护的队列,当它变空时,您希望消费者等待条件变量,直到队列不再为空。您想自动释放互斥锁并在这种情况下等待。