互锁变量访问(在布尔值上)和 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