使用ConcurrentBag代替Arrays(多线程)

时间:2015-01-30 19:22:41

标签: .net multithreading concurrency thread-safety

我有一个数组,每秒大约被多个线程访问(一个编写器线程和一个或两个读取器)。

搜索之后,我最初想到使用" Lock"或"监控"用于保护关键代码的语句(据我所知,在我的情况下,关键代码是写入数组的代码)。

然后我发现.Net 4.x引入了新的Concurrent Collections,在我看来它适合我的需要。

因此,为了安全线程,我不使用数组,而是使用ConcurrentBag。您是否同意我使用此List(ConcurrentBag)的小额开销确实值得?或者你推荐其他收藏品?

注意:我不需要对此array \ list进行任何排序,动态重新调整大小或任何其他操作。它将是一个固定长度,需要它进行读写

提前致谢。

1 个答案:

答案 0 :(得分:1)

通常我会去"使用现成的并发课程"因为它们经过精心设计和全面测试,并且比任何自制的多线程解决方案都更适合大多数用例。

但是当你要求一个简单的解决方案而不需要动态调整大小时,只需转到lock语句(顺便说一下,它在幕后使用Monitor类)。< / p>

小心,因为这个

  

据我所知,我的案例中的关键代码是写入数组的代码。

不是真的。在您的情况下以及在大多数其他情况下,关键代码是访问共享资源的任何代码,无论是读取还是写入。

最佳做法可能是这样的:

private object syncLock = new object();
private string[] yourArray = whatever;

private void ThisMethodReads()
{
    ...
    lock (this.syncLock)
    {
        // Read from the array.
    }
    ...
}

private void ThisMethodReadsAndWrites()
{
    ...
    lock (this.syncLock)
    {
        // Read from and/or write to the array.
    }
    ...
}

为了更好地了解多线程问题及其解决方案,我通常建议使用Joe Albahari's multithreading tutorial