在这个问题中提出,同时写入char数组中的两个不同偏移量意味着数据竞争,因为某些处理器(如Alpha)没有字节寻址,因此很难实现这一点.
我当然看到这会大大减慢在alpha处理器上写入字节的速度(基本上涉及LL/SC),但据我了解C++标准,数组中的每个字段都是它自己的内存位置(尽管从阅读§1.7开始,我可以还将整个数组视为一个内存位置 - 这可能是这个问题归结为的原因).
所以基本上是以下伪代码
char arr[10]; // global field Thread 1: arr[1] = 0; Thread 2: arr[0] = 1;
是否根据C++ 14标准明确定义?
从C++ 14标准(1.7/3):
两个或多个执行线程(1.10)可以更新和访问单独的存储器位置,而不会相互干扰.
之前定义的地方(强调我的)
存储器位置是标量类型的对象或相邻位域的最大序列,所有这些都具有非零宽度.
所以char
数组的s是内存位置,但数组本身不是; 因此,写入不同char
s的单独线程不会相互干扰.