我想知道使用 Windows 的 interlockedXXX
函数访问 bool 值和使用 std::atomic_flag
之间有什么区别。
据我所知,它们都是无锁的,您不能直接设置或读取 atomic_flag
。我想知道是否有更多的差异。
最佳答案
std::atomic_flag
基本上用作构建其他同步原语的原语。如果需要设置或读取,与 std::atomic<bool>
进行比较可能更有意义。
但是,还有一些额外的(概念上的)差异:
interlockedXXX
,您将无法获得可移植代码。 interlockedXXX
是 函数 ,而 std::atomic_flag
(以及 std::atomic
)是 类型 。这是一个显着的区别,因为您可以将 interlockedXXX
与任何合适的内存位置一起使用,例如 std::vector
的元素。相反,您不能制作 C++ 原子标志或原子 bool 值的 vector ,因为相应的类型不满足 vector 值类型要求。 1 您可以在@RmMm 创建的代码中看到后者的区别,其中
flag
是一个普通变量。我还添加了一个带有 atomic<bool>
的案例,您可能会注意到所有三个变体都生成了完全相同的程序集:https://godbolt.org/z/9xwRV6
[1] 这个问题应该由C++20中的
std::atomic_ref
解决。关于c++ - 互锁变量访问(在 bool 值上)和 std::atomic_flag 之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57972175/