C++ 如何从std::atomic<;中提取指针T;T>;?

C++ 如何从std::atomic<;中提取指针T;T>;?,c++,stdatomic,C++,Stdatomic,我有一个简单的课程: class List { List *next; int value; }; 和一个std::atomic Ltag。如何从Ltag中提取实际的列表*? 我尝试了Ltag->value=80,但没有成功。强制转换也不起作用。您可以利用std::atomic的转换运算符 (*Ltag).value = 80; 或者使用load()显式获取值 Ltag.load()->value = 80; PS:您正在将std::atomic与指针一起使用,这意

我有一个简单的课程:

class List {
    List *next;
    int value;
};
和一个
std::atomic Ltag
。如何从
Ltag
中提取实际的
列表*

我尝试了
Ltag->value=80
,但没有成功。强制转换也不起作用。

您可以利用
std::atomic
的转换运算符

(*Ltag).value = 80;
或者使用
load()
显式获取值

Ltag.load()->value = 80;


PS:您正在将
std::atomic
与指针一起使用,这意味着在指向的对象上可能存在数据竞争。

您可以利用
std::atomic
的转换运算符

(*Ltag).value = 80;
或者使用
load()
显式获取值

Ltag.load()->value = 80;


PS:您正在使用带指针的
std::atomic
,这意味着在指向的对象上可能存在数据竞争。

Ltag.load()->value=80因此您有一个指向非原子数据的原子指针。您不需要提取它,只需加载它
atomic
大概不会过载
operator->
这样您就不会忘记存储不会是一个原子操作。这对您有帮助吗?另外,需要记住的一件重要事情是,对于像
std::atomic
这样的东西,只有指针地址是不受竞争条件影响的,而不是指向的对象。如果多个线程读取/写入指向的对象,您将有UB.Side注意:不要对
atomic
过于自信。通常情况下,您不希望保护整个事务,而不仅仅是它的一部分。@alterigel:更接近于重复,它是关于在
原子上使用
.load()->成员
,而不是关于
原子
Ltag.load()->值=80因此您有一个指向非原子数据的原子指针。您不需要提取它,只需加载它
atomic
大概不会过载
operator->
这样您就不会忘记存储不会是一个原子操作。这对您有帮助吗?另外,需要记住的一件重要事情是,对于像
std::atomic
这样的东西,只有指针地址是不受竞争条件影响的,而不是指向的对象。如果多个线程读取/写入指向的对象,您将有UB.Side注意:不要对
atomic
过于自信。通常情况下,您不希望保护整个事务,而不仅仅是它的一部分。@alterigel:更接近于重复,它是关于在
原子
上使用
.load()->成员
,而不是关于
原子
值得注意的是,如果多个线程都在这样做,您仍然会有竞争条件,因为只有地址是原子的,而不是指向的对象。re:safety:值得注意的是,如果多个线程执行此操作,您仍然会有竞争条件,因为只有地址是原子的,而不是指向的对象。re:safety: