我想知道使用 Windows 的 interlockedXXX
函数和使用 std::atomic_flag
访问 bool 值之间有什么区别。
据我所知,它们都是无锁的,您无法直接设置或读取 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>
您可能会注意到所有三个变体都生成完全相同的程序集:
[1] 此问题应由 std::atomic_ref
解决在 C++20 中。
关于c++ - 互锁变量访问( bool 值)和 std::atomic_flag 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57972175/