Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++ 标准与x27之间的差异;s原子布尔和原子旗_C++_Multithreading_C++11_Thread Safety_Atomic - Fatal编程技术网

C++ 标准与x27之间的差异;s原子布尔和原子旗

C++ 标准与x27之间的差异;s原子布尔和原子旗,c++,multithreading,c++11,thread-safety,atomic,C++,Multithreading,C++11,Thread Safety,Atomic,我不知道标准提供的std::atomic变量,但知道标准提供的std::mutex(右图!);然而,有一件事吸引了我的注意:标准提供了两种(对我来说)似乎相同的原子类型,如下所示: std::atomic_标志包含以下说明: std::atomic_flag是一种原子布尔类型。与std::atomic的所有专门化不同,它保证是无锁的。与std::atomic不同,std::atomic_标志不提供加载或存储操作 我不明白。std::atomic是否不保证无锁?那它不是原子还是什么 那么这两者

我不知道标准提供的
std::atomic
变量,但知道标准提供的
std::mutex
(右图!);然而,有一件事吸引了我的注意:标准提供了两种(对我来说)似乎相同的原子类型,如下所示:

  • std::atomic_标志包含以下说明:

    std::atomic_flag
    是一种原子布尔类型。与
    std::atomic
    的所有专门化不同,它保证是无锁的。与
    std::atomic
    不同,
    std::atomic_标志
    不提供加载或存储操作

    我不明白。
    std::atomic
    是否不保证无锁?那它不是原子还是什么

    那么这两者之间的区别是什么?我应该在什么时候使用哪个?

    std::atomic
    保证对变量的访问是原子的。然而,它没有说明原子性是如何实现的。它可以使用无锁变量,也可以使用锁。实际实现取决于您的目标体系结构和类型
    T

    另一方面,std::atomic_标志
    保证使用无锁技术实现

    std::原子布尔类型未保证无锁

    对<代码>标准::原子可以使用锁实现

    那它不是原子还是什么

    std::atomic
    是原子的,无论它是使用锁还是不使用锁实现的<代码>标准::原子_标志保证在不使用锁的情况下实现

    那么b/w两个有什么区别呢

    除免锁保证外,主要区别是:

    std::atomic_标志
    不提供加载或存储操作


    我什么时候应该用哪个


    通常,当需要原子布尔变量时,需要使用
    std::atomic
    std::atomic_flag
    是一种低级结构,可用于实现自定义原子结构。

    如果目标体系结构支持原子操作,则没有理由使用锁。但如果没有,我想知道如何实现
    std::atomic_flag
    。@RustyX:所有现有的架构都至少支持原子加载和set-word(或等效的否定加载和清除字),这足以实现
    std::atomic_flag
    ,但仅此而已。参见PA-RISC,其中
    ldcw
    是唯一的原子RMW op.@RustyX:假设它不能,那就结束了。但正如Fanael所说,这在现实中不是一个问题。@RustyX实际上,提供无锁原子性不需要硬件支持——有一些算法可以安全地做到这一点。然而,首先使用无锁代码的一个主要原因是为了提高对高内容数据/代码的性能,而这些算法比锁慢得多
    std::atomic
    会根据编译的体系结构为您做出选择
    std::atomic_flag
    是“我完全、绝对需要无锁,不管它花费多少”。@Luaan:信号处理需要无锁原子,因为你不能使用锁来保护与信号处理程序共享的状态,而不冒自死锁的风险。“atomic”和“无锁”不是同义词。您可以轻松地实现无锁而不使用原子(当您不执行任何同步时会发生这种情况,例如:P),并且您可以轻松地实现无锁的原子操作(例如,使用监视器)。