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: