c++ - 互锁变量访问( bool 值)和 std::atomic_flag 之间的区别

标签 c++ winapi atomic interlocked

我想知道使用 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>您可能会注意到所有三个变体都生成完全相同的程序集:

https://godbolt.org/z/9xwRV6

<小时/>

[1] 此问题应由 std::atomic_ref 解决在 C++20 中。

关于c++ - 互锁变量访问( bool 值)和 std::atomic_flag 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57972175/

相关文章:

c++ - MinGW 的内存检查库

c++ - COM 端口读取 - 线程在超时发生后保持事件状态

c++ - 指针的 boost 序列化保存指针的十六进制值而不是对象的内容

windows - 我如何计算出在内核调试 session 中使用 WinDBG 等待的事件

c - Cortex-M 3 4 7 的 CMSIS 中有类似 ATOMIC_INC 的东西吗?

c++ - C++ 标准版本与 Visual Studio 版本

c# - 如果我只有一个窗口句柄 (hWnd),我该如何 GetModuleFileName()?

c++ - 使用 MapViewOfFile 分配静态共享内存

c++ - 为什么 std::mutex 比 std::atomic 快?

c++ - 线程本地获取/释放同步