使用 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。
我有一个数组,大约每秒被多个线程定期访问(一个写入线程和一个或两个读取线程)。
经过搜索,我最初想到使用"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。