Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 联锁变量访问(基于布尔值)和std::atomic_标志之间的差异_C++_Winapi_Atomic_Interlocked - Fatal编程技术网

C++ 联锁变量访问(基于布尔值)和std::atomic_标志之间的差异

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

我想知道使用Windows的
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年。