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

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

本文关键字:atomic std flag 区别 之间 访问 变量 布尔值      更新时间:2023-10-16

我想知道使用 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++20std::atomic_ref中得到解决。