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

Difference between interlocked variable access (on boolean) and std::atomic_flag

我想知道使用 Windows' interlockedXXX 函数访问布尔值和使用 std::atomic_flag.

之间有什么区别

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

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 解决。