标准原子布尔和原子旗

时间:2016-09-05 11:08:51

标签: c++ multithreading c++11 thread-safety atomic

我不知道std::atomic变量,但了解标准提供的std::mutex(奇怪的权利!);然而有一件事引起了我的注意:标准提供了两种看似相同(对我而言)的原子类型,如下所示:

  1. std::atomic<bool>类型

  2. std::atomic_flag类型

  3. 还提到std::atomic_flag type -

    的例子
      

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

    我不理解。 std::atomic bool type无法保证无锁定吗?那它不是原子的还是什么?

    那么两者之间的差异以及何时应该使用哪个?

2 个答案:

答案 0 :(得分:29)

  

std :: atomic bool类型不保证无锁?

正确。 std::atomic可以使用锁实现。

  那么它不是原子的还是什么?

std::atomic是原子的,无论是使用锁还是不使用锁实现的。保证在不使用锁的情况下实现std::atomic_flag

  

那么与两个人的区别是什么

除了无锁保证之外的主要区别是:

  

std::atomic_flag不提供加载或存储操作。

  

我什么时候应该使用哪个?

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

答案 1 :(得分:23)

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

另一方面,

std::atomic_flag保证使用无锁技术实现。