假设我在C中有一个这样的数组:
static volatile bool my_array[128] = {0};
最重要的是,我有128个线程,每个线程在完成时都会写入different索引true
.
这会产生一些问题吗?写一个字节对x64上的周围字节没有影响,对吗?
我只是问问,因为我不确定CPU /内存控制器/等是否总是读取8(或4)字节,然后写入它们.这会产生一些奇怪的竞争条件.
非常感谢
假设我在C中有一个这样的数组:
static volatile bool my_array[128] = {0};
最重要的是,我有128个线程,每个线程在完成时都会写入different索引true
.
这会产生一些问题吗?写一个字节对x64上的周围字节没有影响,对吗?
我只是问问,因为我不确定CPU /内存控制器/等是否总是读取8(或4)字节,然后写入它们.这会产生一些奇怪的竞争条件.
非常感谢
正如C17 3.14第2段所确认的,数组中没有两个元素存储在C标准定义的相同的memory location中,因此对数组中单独元素的并发访问或修改不会相互干扰:
3.14个
memory location
标量类型的对象或具有非零宽度的相邻位域的最大序列
Note 1 to entry:两个执行线程可以更新和访问单独的内存位置,而不会相互干扰 其他的.
唯一需要注意的是,在一系列具有非零宽度的相邻位域中,不同位域成员的并发更新,如C17 3.14的下一段所确认的:
- Note 2 to entry:位域和相邻的非位域成员位于不同的存储位置.这同样适用于两个位字段,如果一个在嵌套 struct 声明中声明,而另一个没有声明,或者如果这两个位字段由零长度的位字段声明分隔,或者如果它们由非位字段成员声明分隔.It is not safe to concurrently update two non-atomic bit-fields in the same structure if all members declared between them are also (nonzero-length) bit-fields, no matter what the sizes of those intervening bit-fields happen to be.
(强调我的).
C17 3.14的下一段提供了一个例子:
EXAMPLE一个 struct 声明为
struct { char a; int b:5, c:11,:0, d:8; struct { int ee:8; } e; }
包含四个单独的存储位置:成员100和位域101和102都是单独的存储位置,并且可以同时修改而不相互干扰.位字段103和104一起构成第四存储位置.位字段103和104不能被同时修改,但是例如103和100可以被修改.
NOTE
我推测对"压缩"数组的不同元素或对压缩 struct 的不同成员的并发访问在某些体系 struct 上可能是不安全的,但这超出了C规范的范围.