Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#数组中的线程安全_C#_Multithreading_Arrays_Thread Safety_Critical Section - Fatal编程技术网

C#数组中的线程安全

C#数组中的线程安全,c#,multithreading,arrays,thread-safety,critical-section,C#,Multithreading,Arrays,Thread Safety,Critical Section,是否有两个不同的线程: 从C#数组(例如从第一个位置)读取一次数据, 另一个写入相同的C#数组,但写入不同的位置(例如,写入最后一个位置) 线程是否安全? (我这里的意思是不锁定读写)这个特殊的箱子是安全的,是的 读取和写入阵列的不同部分不会干扰其他操作 但是,在同一位置读写可能会给您带来问题,具体取决于元素的类型和元素的大小。长话短说:是的。只要它能移动到两个不同的位置,它就能安全运行 有一段时间以前,如果你好奇的话,它有一些有用的信息。我不确定这是否保证安全。假设您有字节[]。这些字节被

是否有两个不同的线程:

  • 从C#数组(例如从第一个位置)读取一次数据,
  • 另一个写入相同的C#数组,但写入不同的位置(例如,写入最后一个位置)
线程是否安全?

(我这里的意思是不锁定读写)

这个特殊的箱子是安全的,是的

读取和写入阵列的不同部分不会干扰其他操作


但是,在同一位置读写可能会给您带来问题,具体取决于元素的类型和元素的大小。

长话短说:是的。只要它能移动到两个不同的位置,它就能安全运行


有一段时间以前,如果你好奇的话,它有一些有用的信息。

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

只要这些项目在单独的CPU字+1中,我从来没有想过这是线程安全的,但我理解为什么。谢谢重要的是考虑使用无锁算法时,你认为的“相同位置”与CPU认为的相同位置是不一样的。CPU的内存视图与C语言给出的字节占用地址的视图非常不同。在某些CPU架构(尤其是ARM、Power)上,在某些数据类型上,即使这样也可能不安全。这是正确的,我应该说得更清楚。我暗示这是一个相当大的数组,所以第一个和最后一个项目应该是安全的,但是是的,内存中的项目放在一起可能会造成问题。+1从未想过这是线程安全的,但我理解为什么。谢谢+1:我认为这是最好的答案。最好对无锁线程习惯用法持怀疑态度。我可以想到各种各样的内存障碍问题,即使线程使用不同的数组位置,也会导致问题。只是问题中没有提供足够的信息来给出明确的答案。