互锁变量访问(布尔值)和 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>
的案例,您可能会注意到所有三个变体都产生了完全相同的程序集:
[1] 这个问题应该由 C++20 中的 std::atomic_ref
解决。
我想知道使用 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>
的案例,您可能会注意到所有三个变体都产生了完全相同的程序集:
[1] 这个问题应该由 C++20 中的 std::atomic_ref
解决。