互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别

Posted

技术标签:

【中文标题】互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别【英文标题】:Difference between interlocked variable access (on boolean) and std::atomic_flag 【发布时间】:2019-09-17 10:20:03 【问题描述】:

我想知道使用 Windows 的 interlockedXXX 函数访问布尔值和使用 std::atomic_flag 之间有什么区别。

据我所知,它们都是无锁的,您不能直接设置或读取atomic_flag。我想知道是否还有更多差异。

【问题讨论】:

godbolt.org/z/s8Qn4I 没有区别,只是花了很长时间才将 std::atomic 添加到标准中。 Interlocked 函数在第一个 C++ 标准发布前 5 年就存在了。 【参考方案1】:

std::atomic_flag 基本上用作构建其他同步原语的原语。如果需要设置或读取,与std::atomic<bool> 比较可能更有意义。

但是,还有一些额外的(概念上的)差异:

使用interlockedXXX,您将无法获得可移植代码。

interlockedXXX 是一个函数,而std::atomic_flag(以及std::atomic)是一个类型。这是一个显着的区别,因为您可以将interlockedXXX 与任何合适的内存位置一起使用,例如std::vector 的元素。相反,您不能制作 C++ 原子标志或原子布尔值的向量,因为相应的类型不符合向量值类型要求。 1

您可以在@RmMm 创建的代码中看到后者的区别,其中flag 是一个普通变量。我还添加了atomic<bool> 的案例,您可能会注意到所有三个变体都产生了完全相同的程序集:

https://godbolt.org/z/9xwRV6


[1] 这个问题应该由 C++20 中的std::atomic_ref 解决。

【讨论】:

以上是关于互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

在布尔值上调用成员函数 attach() - Laravel

多个布尔值上的 Knockout.js“如果绑定”

函数if if在布尔值上

Codeigniter 致命错误:在布尔值上调用成员函数 result()

在 [重复] 中调用布尔值上的成员函数 execute()

flex 3 数据网格:如果 == 0 则隐藏值并在布尔值上显示复选框