假设我们的结构如下 -
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?
答案 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));
如果t
和load()
之间的另一个执行线程修改了compare_exchange_weak()
,后者将使用新值{{1}更新expected
(左值)并返回0。
然后,您可以根据更新后的t
再次设置desired
,然后重试。
使用普通expected
而不是CAS,其他线程所做的更新可能会被覆盖(即丢失)。