【发布时间】:2020-07-15 04:24:11
【问题描述】:
我有一个简单的课程:
class List {
List *next;
int value;
};
还有一个std::atomic<List *> Ltag。如何从Ltag 中提取实际的List *?
我尝试了Ltag->value = 80,但没有成功。投射效果不佳。
【问题讨论】:
-
Ltag.load()->value = 80; -
所以你有一个指向非原子数据的原子指针。您不需要提取它,只需加载它。
atomic<T*>不会超载operator->大概是为了让您不要忘记存储不会是原子操作。 -
this Q/A 对您有帮助吗?另外,要记住的重要一点是,对于像
std::atomic<List*>这样的东西,只有指针地址不受竞争条件的影响,而不是指向的对象。如果多个线程读取/写入/从指向的对象读取/写入,您将拥有 UB。 -
旁注:不要对
atomic过于自信。更多情况下,您不想保护整个交易,而不仅仅是其中的一部分。 -
@alterigel: Is it safe to use the Structure dereference(->) operator on the result of std::atomic::load 更接近重复,它是关于在
atomic<T*>上使用.load()->member,而不是关于atomic<node>