条件变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条件变量相关的知识,希望对你有一定的参考价值。

https://www.zhihu.com/question/24116967

吴志强的回答,回答下高大月的评论。

 

 

1.为什么要有互斥量?

因为要用来防止『查询条件符合则等待』和『设置条件则释放信号』两个事情发生竞争条件。

 

2.为什么要作为参数传进去?

虚假唤醒是很难避免的,其中一个原因和调度相关,signal和broadcast只是把一个或多个等待的线程放到ready queue上,并不保证马上就调度到,因此线程从pthread_cond_wait返回的时候条件有可能又不成立了。举个例子,两个线程AB在wait,第三个线程将pass改成1,然后broadcast;线程A唤醒后把pass改成0,接着线程B唤醒,这时候对B来说条件已经不满足了。因此用while检查条件是必须的。检查条件的时候必然要拿锁,这时候pthread_cond_wait退出前重新获得锁就显的很方便了。

以上是关于条件变量的主要内容,如果未能解决你的问题,请参考以下文章

线程同步——条件变量

再谈条件变量—从入门到出家

DEA模型变量要满足的条件

POSIX条件变量

[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)

[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)