C#数组中的线程安全性

有2个不同的线程:

  • 一个从C#数组读取(例如从第一个位置读取),
  • 另一个写入相同的C#数组但写入不同的位置(例如到最后一个位置)

线程安全与否?
(我的意思是这里没有锁定阅读或写作)

这个特例是安全的,是的。

读取和写入数组的不同部分不会干扰其他操作。

但是,根据元素的类型和元素的大小,读取和写入相同的位置可能会给您带来问题。

我不确定这是否安全。 想象一下你有byte []。 这些字节紧密堆积在内存中。 现在,如果修改这些字节,编译器可能会合并某些写操作以执行字(32位)大小的读取修改写入操作。 在某些CPU上,例如ARM,这是编译器唯一的内存修改指令。 如果您一次修改多个字节,这尤其方便。 CPU也可以做同样的事情。 它也可以在你不知道的情况下重新排序。 面对这种优化,读取相邻存储器的线程可能会看到部分修改。 您通常不会看到这种效果,因为堆分配器对您很好,并且总是为您提供至少字对齐的内存。

长话短说:是的。 只要它到两个不同的位置,它就是一个安全的操作。

前一段时间有一个关于这个问题的讨论 ,如果你很好奇,它会提供一些有用的信息。