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退出前重新获得锁就显的很方便了。