修改数组中的一个元素而另一个线程修改同一个数组的另一个元素时,它是定义良好的行为吗?

fuz*_*fuz 8 c synchronization pthreads undefined-behavior

给定类型的阵列foo_t[n]和一组Ñ线程,其中每一个的Ñ线程读取和修改阵列的不同元件,我需要显式同步阵列的修改或我可以假设,同时变更部件的阵列是定义明确的行为?它有多大foo_t/哪个对齐有关系?

fuz*_*fuz 6

我尝试做的是明确定义的行为.

见ISO/IEC 9899:2011§5.1.2.4.27:

注13:引入可能由抽象机器修改的潜在共享内存位置的编译器的编译器转换通常被本标准排除,因为在抽象机器执行的情况下,这样的分配可能会覆盖另一个线程的另一个分配.没有遇到过数据竞争.这包括覆盖不同内存位置中相邻成员的数据成员分配的实现.在有问题的原子可能混淆的情况下,我们通常也会排除原子载荷的重新排序,因为这可能违反了"可见序列"规则.

请注意,此语言是在C11中引入的,以便进行优化,从而导致此类错误非法.C11之前的编译器可能不遵守此规则.