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

cel*_*chk 17 c++ multithreading memory-model thread-safety c++11

假设您有以下定义:

struct X
{
  char a, b;
};

X x;
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*ica 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;
}
Run Code Online (Sandbox Code Playgroud)

包含四个独立的存储单元:字段a和位字段d,e.ee每个单独的存储单元,可以同时修改而不会相互干扰.所述位字段bc一起构成第四存储器位置.所述位字段bc不能同时修改,但ba,例如,可以是.- 末端的例子 ]

这些一起意味着构件abX是分开的存储器位置,并且因此可以同时访问.