我不知道std::atomic
变量,但了解标准提供的std::mutex
(奇怪的权利!);然而有一件事引起了我的注意:标准提供了两种看似相同(对我而言)的原子类型,如下所示:
还提到std::atomic_flag type
-
std :: atomic_flag是一种原子布尔类型。与std :: atomic的所有特化不同,它保证是无锁的。与std :: atomic不同,std :: atomic_flag不提供加载或存储操作。
我不理解。 std::atomic bool type
无法保证无锁定吗?那它不是原子的还是什么?
那么两者之间的差异以及何时应该使用哪个?
答案 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
保证使用无锁技术实现。