21

假设您有以下定义:

struct X
{
  char a, b;
};

X x;

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

4

1 回答 1

27

它是安全的。引用 C++11:

[intro.memory]p3:

内存位置要么是标量类型的对象,要么是所有具有非零宽度的相邻位域的最大序列。[注意:语言的各种特性,例如引用和虚函数,可能涉及程序无法访问但由实现管理的额外内存位置。—尾注] 两个执行线程 (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,例如,可以。—结束示例]

这些一起意味着成员abofX是单独的内存位置,因此可以同时访问。

于 2013-08-18T20:31:23.920 回答