C ++ 11内存模型并在不同的线程中访问同一结构的不同成员

时间:2013-08-18 20:12:29

标签: c++ multithreading c++11 thread-safety memory-model

假设您有以下定义:

struct X
{
  char a, b;
};

X x;

现在假设您有两个线程,其中一个读取和写入x.a但从不访问x.b而另一个读取和写入x.b但从不访问x.a 。两个线程都不使用任何锁或其他同步原语。这可以保证在C ++ 11中有效吗?或者它是否算作访问同一个对象,因此需要锁定?

1 个答案:

答案 0 :(得分:26)

这很安全。引用C ++ 11:

[intro.memory] ​​P3:

  

内存位置是标量类型的对象或相邻位域的最大序列,所有这些都具有非零宽度。 [注意:该语言的各种功能(如引用和虚函数)可能涉及程序无法访问但由实现管理的其他内存位置。 -end note ]两个执行线程(1.10)可以更新和访问不同的内存位置,而不会相互干扰。

[intro.memory] ​​P5:

  

[示例:声明为

的结构
struct {
  char a;
  int b:5,
  c:11,
  :0,
  d:8;
  struct {int ee:8;} e;
}
  

包含四个独立的内存位置:字段a和位字段de.ee都是独立的内存位置,可以同时修改而不会相互干扰。位域bc一起构成第四个存储位置。位字段bc无法同时修改,但例如ba可以。 -end example ]

这些共同意味着a的成员bX是独立的内存位置,因此可以同时访问。