拥有两个不同的线程:
- 一个从C#数组中读取(例如,从第一个位置开始)
- 另一个将数据写入到相同的C#数组但是写入到不同的位置(例如,写入到最后一个位置)
这种情况下是否线程安全?
(我指的是在没有锁定读取或写入的情况下)
拥有两个不同的线程:
这种情况下是否线程安全?
(我指的是在没有锁定读取或写入的情况下)
这个特定的情况是安全的。
读写数组的不同部分不会干扰其他操作。
然而,如果读写同一位置,则可能会出现问题,具体取决于元素类型和元素大小。
我不确定这样做是否保证安全。想象一下你有一个byte[]数组,这些字节在内存中紧密地排列着。现在,如果你修改这些字节,编译器可能会合并一些写操作以执行32位大小的读取修改写入操作。在某些CPU上,例如ARM,这是编译器唯一的一种内存修改指令。如果你一次要修改多个字节,这将非常方便。CPU也可以做同样的事情,而且可以在你不知道的情况下重新排序。面对这种优化,一个线程读取相邻内存时可能会看到部分修改。通常情况下你看不到这种效果,因为堆分配器很好心地给你分配了至少按字对齐的内存。