假设您有以下定义:
struct X
{
char a, b;
};
X x;
现在假设您有两个线程,其中一个读取和写入x.a
但从不访问x.b
而另一个读取和写入x.b
但从不访问x.a
。两个线程都不使用任何锁或其他同步原语。这可以保证在C ++ 11中有效吗?或者它是否算作访问同一个对象,因此需要锁定?
答案 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
和位字段d
和e.ee
都是独立的内存位置,可以同时修改而不会相互干扰。位域b
和c
一起构成第四个存储位置。位字段b
和c
无法同时修改,但例如b
和a
可以。 -end example ]
这些共同意味着a
的成员b
和X
是独立的内存位置,因此可以同时访问。