嵌套原子操作是否保证为原子操作
Are nested atomic operations guaranteed to be atomic?
抱歉,如果
这个问题已经得到了回答,或者如果我错过了一些明显的东西。
我试图了解原子性的保证有多深 std::atomic
.例如,如果我们有
std::atomic<int> a(0);
a.store(1);
存储操作是原子操作。但是,如果我们有嵌套的原子操作,会发生什么,例如:
std::atomic<int> a(0);
std::atomic<int> b(1);
a.store(++b);
我的理解是,++b
是原子的,store()
也是。我假设这保证以原子方式存储在a
中2
是否正确?
更重要的是,如果在T1
线程和T2
线程之间共享a
和b
,是否可以保证两个线程执行的a.store(++b);
将b
的递增值(如各自线程所见)存储在每个线程中原子a
中?换句话说,线程T2
可以在T1
已经递增一次a
之后再次"对接"并再次递增b
T1
?
增量
是原子的,存储是原子的,但这两个操作一起不是原子的。 第一个线程可能会递增b
,被挂起,然后另一个线程递增b
并将该值存储在a
中,然后第一个线程恢复并将其(现已过时)的值b
存储到a
中。
原子
性不组成。
假设没有其他人曾经写入a
和b
,并且另一个线程在它们存在后尝试读取两者,并且它们读取b
然后a
,可能的读取恰好是:
{b,a}
{1,0}
{2,0}
{2,2}
如果他们读a
,那么b
:
{a,b}
{0,1}
{0,2}
{2,2}
在这种情况下,它与b
相同,然后a
.
a.store(++b);
相当于
int temp = ++b;
/* other threads can modify `b` but its value has been save in temp ... */
a.store(temp);
相关文章:
- 原子读取是否保证读取最新值
- 对OpenMP reduction子句中的变量执行原子操作
- 原子获取是否与互斥锁释放同步?
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 标记为 std::memory_order_seq_cst 的单个原子操作是否会在所有位置触发顺序一致性?
- C++11:16 字节原子<>变量是否在 16 字节边界上自动对齐,从而允许CMPXCHG16B指令?
- 对单个变量的原子操作
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 为什么互斥对象与原子操作不同,前者是操作系统级,后者是处理器级
- blaze-lib 的元素操作是否自动并行?
- C++标准:松弛的原子存储是否可以提升到互斥锁以上
- 原子变量的多重赋值是原子操作吗?
- fetch_mult的原子实现是否正确?
- 对标准类型使用原子操作
- 静态断言添加操作是否可用
- 即使在单线程程序中,共享指针是否在引用计数中使用原子操作
- 嵌套原子操作是否保证为原子操作
- 使用memory_order_relax来加载原子变量是否安全,如果只有一个线程对该变量进行写操作
- 在忙碌等待循环中是否需要内存屏障或原子操作
- 是否存在原子|=操作