gpt4 book ai didi

c++ - std::atomic 是否使所有成员也是原子的?

转载 作者:行者123 更新时间:2023-11-30 03:30:11 26 4
gpt4 key购买 nike

假设我们有如下结构-

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?

最佳答案

您正在将 POD 包装在 atomic 类型中。在原子对象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() 之间的另一个执行线程修改,后者将更新 expected (左值)与 t 的新值并返回 0。然后根据更新后的 expected 再次设置 desired 并重试。

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

关于c++ - std::atomic<struct> 是否使所有成员也是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45192021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com