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