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),并且您可以轻松地实现无锁的原子操作(例如,使用监视器)。