std :: atomic <struct>是否使所有成员也成为原子成员?

时间:2017-07-19 13:25:24

标签: c++ multithreading c++11

假设我们的结构如下 -

struct test
{
    int a;
    int b;
};

我创建了这个结构的原子变量并尝试更新a和b。这些操作是原子的吗?使结构/类原子化是什么意思?

std::atomic<test> t;
t.a = 10;   // is this an atomic operation?
t.b = 20;   // is this an atomic operation?
// I understand a and b are not atomic in themselves but I am confused     
// as to when you say struct temp is atomic what does it mean?
// does it mean the t instance's this pointer is atomic?

1 个答案:

答案 0 :(得分:2)

您正在以atomic类型包裹POD。在原子对象t上,只能执行原子操作,例如load()store()compare_exchange_weak()。 这些操作适用于整个POD(不是其中的一部分)并且是不可分割的;即它们不间断地发生,或者根本不发生。

如果您想以原子方式更改成员a,那么只有在更新整个t对象时才可以这样做,但由于您不想修改成员b, 你需要一个CAS(比较和交换)操作:

std::atomic<test> t;

test expected = t.load();
test desired;

do {
    desired = expected;
    desired.a = 10;

} while(!t.compare_exchange_weak(expected, desired));

如果tload()之间的另一个执行线程修改了compare_exchange_weak(),后者将使用新值{{1}更新expected(左值)并返回0。 然后,您可以根据更新后的t再次设置desired,然后重试。

使用普通expected而不是CAS,其他线程所做的更新可能会被覆盖(即丢失)。