在POSIX中,由于"虚假唤醒";问题是,程序员在检查条件时被迫使用while()
而不是if
。
我认为虚假唤醒是一个不直观和令人困惑的问题,但我认为这是一个不可避免的问题。
最近,我发现win32的事件对象没有"虚假唤醒";问题
为什么POSIX系统和其他系统仍然使用条件变量;虚假唤醒";问题(尽管这样可以解决吗?(
您询问:
为什么POSIX系统和其他系统仍然使用条件变量;虚假唤醒";问题(尽管如此,是否可以解决?(
基本上,它比备选方案更快。
POSIX.1-2017对CCD_ 3和CCD_;条件信号的多次唤醒":
虽然["虚假唤醒"]问题可以解决,但很少发生的边缘条件的效率损失是不可接受的,特别是考虑到无论如何都必须检查与条件变量相关的谓词。纠正这个问题将不必要地降低这个基本构建块中所有高级同步操作的并发程度。
添加了强调。
文本进一步观察到;围绕条件等待"的谓词测试循环;是一种比替代方案更稳健的编码实践,因为应用程序必然会容忍来自代码中其他地方的多余广播和信号。