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

给定一个类型为foo_t[n]的数组和一组n个线程,其中n个线程中的每个线程都读取并修改数组的不同元素,我是否需要显式同步数组的修改,或者我可以假设同时修改成员数组是明确定义的行为? 它有多大foo_t /它的对齐方式有关系吗?

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

见ISO / IEC 9899:2011§5.1.2.4.27:

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

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