在this问题中提出,同时写入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标准明确定义?
答案 0 :(得分:6)
从C ++ 14标准(1.7 / 3):
两个或多个执行线程(1.10)可以更新和访问不同的内存位置,而不会相互干扰。
之前定义的地方(强调我的)
内存位置可以是标量类型的对象,也可以是所有相邻位域的最大序列 非零宽度。
所以数组的char
是内存位置,但数组本身不是;因此,写入不同char
的单独线程不会相互干扰。