[英]Spurious wakeup with atomics and condition_variables
std::atomic<T>
和std::condition_variable
都有成员wait
和notify_one
函数。 在某些应用程序中,程序员可能会选择使用其中任何一种来进行同步。 这些wait
函数的一个目标是它们应该与操作系统协调以最大限度地减少虚假唤醒。 也就是说,操作系统应该避免唤醒wait
线程,直到notify_one
或notify_all
被调用。
在我的机器上, sizeof(std::atomic<T>)
是sizeof(T)
而sizeof(std::condition_variable)
是 72。如果排除std::atomic<T>
的T
成员,则std::condition_variable
保留 72 个字节用于同步目的,而sizeof(std::atomic<T>)
保留 0 个字节。
我的问题:我应该期望std::condition_variable
和std::atomic<T>
的wait
函数之间有不同的行为吗? 例如, std::condition_variable
是否应该有更少的虚假唤醒?
我的问题:我应该期望
std::condition_variable
和std::atomic<T>
的wait
函数之间有不同的行为吗? 例如,std::condition_variable
是否应该有更少的虚假唤醒?
std::atomic::wait
没有虚假唤醒。 该标准保证观察到变化的值,它在[atomics.types.generic.general]/30中说:
效果:按顺序重复执行以下步骤:
(30.1) 评估 load(order) 并将其值表示与旧值表示相等。
(30.2) 如果它们比较不相等,则返回。
(30.3) 阻塞直到它被原子通知操作解除阻塞或被虚假解除阻塞。
因此,如果原子等待的底层实现产生虚假唤醒,它们会被 C++ 标准库实现隐藏。
如果您的问题是关于在原子或条件变量的底层实现中是否存在更多或更少的虚假唤醒,那么它是特定于实现的。 将取决于操作系统和库的实现。 最可能的答案是:不,因为最终实现,操作系统进行内核调用的地方很可能是相同的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.