c++ 中的原子指针和线程间对象传递

问题描述 投票:0回答:2

我的问题涉及

std::atomic<T*>
和这个指针指向的数据。如果在线程 1 中我有

Object A;
std:atomic<Object*> ptr;
int bar = 2;
A.foo = 4;  //foo is an int;
ptr.store(*A);

如果在线程 2 中我观察到

ptr
指向
A
,我可以保证
ptr->foo
是 4 和
bar
是 2 吗?

原子指针的默认内存模型(顺序一致)是否保证在其他线程看到相同

 A.foo
两种情况?
如果有帮助或重要,我正在使用 x64(我只关心这个平台)、gcc(具有支持原子的版本)。

c++ multithreading c++11 atomic memory-model
2个回答
19
投票

内存模型原理:

C++11 原子使用

默认

atomic.store 内存排序,这意味着操作是

顺序一致
. 这个语义是所有操作的排序就好像所有这些操作都是按顺序执行的:

    C++ 标准第 29.3/3 节解释了它如何适用于
  • atomics

    :“所有 memory_order_seq_cst 操作都应有一个总顺序 S,与所有受影响位置的 “发生在之前” 顺序和修改顺序一致,这样每个 memory_order_seq_cst 加载值的操作观察到根据此顺序 S 的最后一次修改,或者不是 memory_order_seq_cst 的操作的结果。

  • 1.10/5 节解释了这如何影响
  • 也是非原子的

    :“库定义了一些原子操作(...),它们被特别标识为同步操作。这些操作在进行分配时起着特殊的作用在一个线程中对另一个可见。

  • 你的问题的答案是肯定的!

非原子数据的风险

然而,您应该意识到,实际上,非原子值的一致性保证更为有限。

假设第一个执行场景:

std::memory_order_seq_cst

在这里,
(thread 1) A.foo = 10; (thread 1) A.foo = 4; //stores an int (thread 1) ptr.store(&A); //ptr is set AND synchronisation (thread 2) int i = *ptr; //ptr value is safely accessed (still &A) AND synchronisation

是4。因为

i
是原子的,线程(2)在读取指针时安全地得到值
ptr
。内存排序确保在
&A
之前进行的所有分配都被其他线程看到(“发生在”约束之前)。
但是假设第二种执行场景:

ptr

这里的结果是未定义的。它可能是 4,因为内存排序保证了在 
(thread 1) A.foo = 4; //stores an int (thread 1) ptr.store(&A); //ptr is set AND synchronisation (thread 1) A.foo = 8; // stores int but NO SYNCHRONISATION !! (thread 2) int i = *ptr; //ptr value is safely accessed (still &A) AND synchronisation

分配之前发生的事情被其他线程看到。但没有什么能阻止事后所做的分配也被看到。所以它可能是 8.

如果您有 

ptr

而不是

*ptr = 8;
那么您将再次确定:
A.foo=8;
将是 8.
您可以通过实验验证这一点,例如:

i

结论

总而言之,你的问题的答案是肯定的,但前提是同步后非原子数据没有发生其他变化。主要的风险是只有

void f1() { // to be launched in a thread secret = 50; ptr = &secret; secret = 777; this_thread::yield(); } void f2() { // to be launched in a second thread this_thread::sleep_for(chrono::seconds(2)); int i = *ptr; cout << "Value is " << i << endl; }

是原子的。但这不适用于指向的值。

需要注意的是,当您将原子指针重新分配给非原子指针时,尤其是指针会带来进一步的同步风险。

例子:

ptr



6
投票

所以看到你的商店的线程也会看到在它之前执行的所有操作。

您可以在

这里

找到更多详细信息

© www.soinside.com 2019 - 2024. All rights reserved.