嵌套原子操作是否保证为原子操作

Are nested atomic operations guaranteed to be atomic?

本文关键字:原子操作 是否 嵌套      更新时间:2023-10-16
抱歉,如果

这个问题已经得到了回答,或者如果我错过了一些明显的东西。

我试图了解原子性的保证有多深 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()也是。我假设这保证以原子方式存储在a2是否正确?

更重要的是,如果在T1线程和T2线程之间共享ab,是否可以保证两个线程执行的a.store(++b);b的递增值(如各自线程所见)存储在每个线程中原子a中?换句话说,线程T2可以在T1已经递增一次a之后再次"对接"并再次递增b T1

增量

是原子的,存储是原子的,但这两个操作一起不是原子的。 第一个线程可能会递增b,被挂起,然后另一个线程递增b并将该值存储在a中,然后第一个线程恢复并将其(现已过时)的值b存储到a中。

原子

性不组成。

假设没有其他人曾经写入ab,并且另一个线程在它们存在后尝试读取两者,并且它们读取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);