线程安全数组

时间:2011-05-23 14:14:59

标签: c# arrays multithreading thread-safety

我对多线程非常糟糕,但自从我将以下行添加到我的应用程序后,它似乎经常崩溃所以我假设它不是线程安全的。

private readonly string [] _foo = Enumerable.Range(1,1000).Select(i => i.ToString())。ToArray();

我有什么选择让这个线程安全?

3 个答案:

答案 0 :(得分:1)

初始化数组的代码很好。您将数组标记为readonly,这意味着无法将新数组分配给_foo字段 - 但您的代码仍然可以修改数组的元素。操作本身不会导致崩溃,但如果从多个线程更改阵列,则可能会出现意外结果。

如果没有更多信息,很难说出问题所在。您的应用程序以何种方式崩溃?

答案 1 :(得分:1)

如果您使用的是C#4,则可以使用一些已内置的集合。它们比任何阻塞集合更快,因为它们依赖于无锁策略。

查看Concurrent Collections

答案 2 :(得分:0)

  • List<T>T[] - &gt; SynchronizedCollection<T>(请注意枚举不是线程安全的)
  • Dictionary<T> - &gt; ConcurrentDictionary<T>
  • Queue<T> - &gt; ConcurrentQueue<T>
  • Stack<T> - &gt; ConcurrentStack<T>
  • 还考虑BlockingCollection<T>生产者 - 消费者场景