本文简单介绍了一些 虚假唤醒(spurious wakeup) 相关的知识
(注: 本文假设读者对多线程开发有一定了解)
高层次的多线程编程中,条件变量是个常见的同步方法,跟传统仅使用互斥量的方法相比...,条件变量可以减少锁的竞争....应该一定为真,但是细心的朋友应该会发现,代码中我们却使用了一个循环来检查 g_signaled 的真值(并在发现 g_signaled 不为真时释放互斥锁然后重新进入了等待(通过重新调用 pthread_cond_wait...所谓 虚假唤醒,指的是即便我们没有 signal 相关的条件变量(即没有调用 pthread_cond_signal),等待(调用了 pthread_cond_wait)的线程也可能被(虚假)唤醒,此时我们必须重新检查对应的标记值...即使消除了虚假唤醒,我们仍然需要循环检查标记值
这可能令人比较意外,问题在于除了虚假唤醒,还有一种称为 stolen wakeups 的现象也可能会影响标记值.