我想知道使用 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/

    10-11 22:45
    查看更多