我有一个数组,每秒大约被多个线程访问(一个编写器线程和一个或两个读取器)。
搜索之后,我最初想到使用" Lock"或"监控"用于保护关键代码的语句(据我所知,在我的情况下,关键代码是写入数组的代码)。
然后我发现.Net 4.x引入了新的Concurrent Collections,在我看来它适合我的需要。
因此,为了安全线程,我不使用数组,而是使用ConcurrentBag。您是否同意我使用此List(ConcurrentBag)的小额开销确实值得?或者你推荐其他收藏品?
注意:我不需要对此array \ list进行任何排序,动态重新调整大小或任何其他操作。它将是一个固定长度,需要它进行读写
提前致谢。
答案 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。