C++11 C+中的数据竞争+;

C++11 C+中的数据竞争+;,c++11,x86,C++11,X86,一级缓存线的大小等于64B struct S { int a; int b; }; 是C++中的数据竞赛吗? 不,这不是一场数据竞赛s.a和s.b是不同的存储位置。它们相互独立地访问和修改 [intro.memory]/3内存位置要么是标量类型的对象,要么是相邻位字段的最大序列,所有字段的宽度都不为零。[注:语言的各种功能,如引用和虚拟函数,可能涉及程序无法访问但由实现管理的附加内存位置。-结束注]两个或多个执行线程(1.10)可以更新和访问单独的内存位置,而不会相互干扰 是的,但请注意CPU

一级缓存线的大小等于64B

struct S {
int a;
int b;
};

是C++中的数据竞赛吗? 不,这不是一场数据竞赛

s.a
s.b
是不同的存储位置。它们相互独立地访问和修改

[intro.memory]/3内存位置要么是标量类型的对象,要么是相邻位字段的最大序列,所有字段的宽度都不为零。[注:语言的各种功能,如引用和虚拟函数,可能涉及程序无法访问但由实现管理的附加内存位置。-结束注]两个或多个执行线程(1.10)可以更新和访问单独的内存位置,而不会相互干扰


是的,但请注意CPU并没有将:内存地址视为一个字节。它看到缓存行。这不是你的问题,而是C++编译器和/或CPU的问题。编译后的程序必须表现为
s.a
s.b
是独立的,否则编译器是不一致的(也称为bug)。您询问您的示例是否根据C++语言规则展示数据竞赛:它没有。硬件实现细节与此问题无关。因此,您的意思是根据定义,
s.a
是标量类型的对象吗?@J.Doe您可能对MESI协议和变体感兴趣,它们用于保持处理器之间的缓存一致性(在IA32e系列中)。@J.Doe:更具体地说,在不同的线程中独立使用s.a和s.b是一个教科书式的“错误共享”示例,导致缓存线将它们从一个核心乒乓到另一个核心。这对性能极为不利,但不会出现任何正确性问题。
global S s;
Thread1:
s.a = 2;

Thread2: 
s.b = 1;