使用 ConcurrentBag 而不是数组(多线程)

Using ConcurrentBag instead of Arrays (multithreading)

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

经过搜索,我最初想到使用"Lock"或"Monitor"语句来保护关键代码(据我了解,在我的案例中,关键代码是写入数组的代码)。

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

因此,为了 safe-threading,我将使用 ConcurrentBag 而不是使用数组。您是否同意我的看法,即使用此列表 (ConcurrentBag) 的小开销成本是否值得?或者你推荐其他 collection?

注意:我不需要对此 array\list 进行任何排序、动态 re-sizing 或任何其他操作。它将是一个 fixed-length 并且需要它来进行读写

提前致谢。

通常我会选择 "use the readily available concurrent classes",因为它们经过精心设计和全面测试,比任何自制的多线程解决方案更适合大多数用例。

但是当你要求一个不需要动态调整大小的简单解决方案时,只需使用 lock 语句(顺便说一句,它正在使用 Monitor class幕后)。

小心,因为这个

As I understand the critical code in my case is the one that writes to the array.

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

最佳实践可能是这样的:

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