2010-05-09 204 views
12

是否具有2个不同的线程:从C#阵列(例如,从第一位置)
线程安全

  • 一个读数,
  • ,另一个写入到相同的C#阵列,但至不同的位置(例如到最后一个位置)

线程安全吗?
(我的意思是这里没有锁定读取或写入)

回答

8

这个特殊情况是安全的,是的。

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

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

+1

只要这些项目在单独的CPU字词 – Stewart 2010-05-09 19:55:56

+0

+1从来没有想过这是线程安全的,但我明白它为什么。谢谢! – 2010-05-09 19:57:29

+0

考虑使用无锁算法时,认为“同一位置”与CPU(多个)所认为的位置不同,这一点很重要。内存的CPU视图与C这样的视图语言完全不同,它给了我们字节占用地址的地方。在某些数据类型的某些CPU架构(特别是ARM,Power)上,即使这可能不安全 – Stewart 2010-05-09 22:59:57

5

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

前段时间有一个discussion about this,如果您好奇,它有一些有用的信息。

+0

+1从来没有想过这是线程安全的,但我明白它是为什么。谢谢! – 2010-05-09 19:56:36

7

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

+1

+1:在我看来这是最好的答案。总是最好怀疑无锁的穿线习语。我可以想到各种内存障碍问题,即使线程在不同的阵列位置上工作也可能导致问题。只是在问题中提供的信息不足以给出明确的答案。 – 2010-05-09 20:57:11