0

在 POSIX 中,由于“虚假唤醒”问题,程序员在检查条件时被迫使用while()而不是。if

我认为虚假唤醒是不直观且令人困惑的问题,但我认为这是一个不可避免的问题。

最近发现win32的事件对象不存在“虚假唤醒”的问题。

为什么 POSIX 系统和其他系统仍然使用具有“虚假唤醒”问题的条件变量?(尽管这可以解决?)

4

1 回答 1

2

你问:

为什么 POSIX 系统和其他系统仍然使用具有“虚假唤醒”问题的条件变量?(尽管这可以解决?)

基本上,它比替代方案更快。

pthread_cond_broadcastPOSIX.1-2017 处理的RATIONALE 部分pthread_cond_signal特别有关于“条件信号的多重觉醒”的说法:

虽然 [“虚假唤醒”] 问题可以解决,但很少发生的边缘条件的效率损失是不可接受的,特别是考虑到无论如何都必须检查与条件变量相关联的谓词。纠正这个问题会不必要地降低这个基本构建块中所有更高级别同步操作的并发程度。

重点补充。

文本进一步观察到,强制“条件等待周围的谓词测试循环”是一种比替代方案更强大的编码实践,因为应用程序必然会容忍来自代码中其他地方的多余广播和信号。

于 2021-05-17T14:18:08.030 回答