是否有 2 个不同的线程:
- 从 C# 数组中读取一次(例如从第一个位置),
- 另一个写入相同的 C# 数组但写入不同的位置(例如,写入最后一个位置)
线程安全与否?
(我的意思是这里没有锁定阅读或写作)
是否有 2 个不同的线程:
线程安全与否?
(我的意思是这里没有锁定阅读或写作)
这种特殊情况是安全的,是的。
读取和写入数组的不同部分不会干扰其他操作。
但是,读取和写入同一位置可能会给您带来问题,具体取决于元素的类型和元素的大小。
我不确定这是否保证安全。想象一下你有 byte[]。这些字节紧密地打包在内存中。现在,如果您修改这些字节,编译器可能会合并一些写入以执行字(32 位)大小的读取修改写入操作。在某些 CPU(例如 ARM)上,这是编译器仅有的一种内存修改指令。如果您一次修改多个字节,这将特别方便。CPU 也可以做同样的事情。它还可以在您不知情的情况下重新排序东西。面对这种优化,读取相邻内存的线程可能会看到部分修改。您通常不会看到这种效果,因为堆分配器对您很好,并且总是为您提供至少是字对齐的内存。
长话短说:是的。只要它到两个不同的位置,它的一个安全的操作。
前段时间对此进行了讨论,如果您好奇,它会提供一些有用的信息。