C++ 联锁变量访问(基于布尔值)和std::atomic_标志之间的差异
我想知道使用Windows的C++ 联锁变量访问(基于布尔值)和std::atomic_标志之间的差异,c++,winapi,atomic,interlocked,C++,Winapi,Atomic,Interlocked,我想知道使用Windows的interlockedXXX函数访问布尔值和使用std::atomic_flag访问布尔值有什么区别 据我所知,它们都是无锁的,您不能直接设置或读取原子标记。我想知道是否还有更多的区别。std::atomic_flag基本上用作构建其他同步原语的原语。如果需要设置或读取,与std::atomic进行比较可能更有意义 但是,还有一些额外的(概念上的)差异: 使用interlockedXXX,您将无法获得可移植代码 interloctedxxx是一个函数,而std::a
interlockedXXX
函数访问布尔值和使用std::atomic_flag
访问布尔值有什么区别
据我所知,它们都是无锁的,您不能直接设置或读取
原子标记。我想知道是否还有更多的区别。std::atomic_flag
基本上用作构建其他同步原语的原语。如果需要设置或读取,与std::atomic
进行比较可能更有意义
但是,还有一些额外的(概念上的)差异:
- 使用
interlockedXXX
,您将无法获得可移植代码
interloctedxxx
是一个函数,而std::atomic_标志
(以及std::atomic
)是一个类型。这是一个显著的区别,因为您可以将interlockedXXX
与任何合适的内存位置一起使用,例如std::vector
的元素。相反,不能生成C++原子标志或原子布尔的向量,因为相应的类型不满足向量值类型要求。一,
您可以在@RmMm创建的代码中看到后一个差异,其中flag
是一个普通变量。我还添加了一个带有atomic
的case,您可能会注意到,所有这三个变体都生成了非常相同的程序集:
[1] 这个问题应该在C++20中解决。没有区别,只是花了很长时间才将std::atomic添加到标准中。联锁功能在第一C++标准发布之前已经存在了5年。