假设我在 C 中有一个这样的数组:
static volatile bool my_array[128] = {0};
最重要的是,我有 128 个线程,每个线程在完成时都会写入不同的索引。true
这会产生一些问题吗?在 x64 上写入单个字节不会影响周围的字节,对吗?
我只是问,因为我不确定CPU/内存控制器/等是否总是读取8(或4)字节,然后写入它们。这会产生一些奇怪的竞争条件。
多谢
假设我在 C 中有一个这样的数组:
static volatile bool my_array[128] = {0};
最重要的是,我有 128 个线程,每个线程在完成时都会写入不同的索引。true
这会产生一些问题吗?在 x64 上写入单个字节不会影响周围的字节,对吗?
我只是问,因为我不确定CPU/内存控制器/等是否总是读取8(或4)字节,然后写入它们。这会产生一些奇怪的竞争条件。
多谢
根据 C 标准的定义,数组的两个元素不会存储在同一内存位置,因此数组的单独元素的并发访问或修改不会相互干扰,正如 C17 3.14 第 2 段所确认的那样:
唯一需要注意的是,所有具有非零宽度的相邻位域序列中不同位域成员的并发更新,如 C17 3.14 的下一段所证实:
(强调我的)。
C17 3.14 的下一段提供了一个示例:
笔记
我推测,在某些体系结构上,并发访问“打包”数组的不同元素或打包结构的不同成员可能是不安全的,但这超出了 C 规范的范围。