什么更好以及为什么使用List作为线程安全:BlockingCollection或ReaderWriterLockSlim或锁定?

时间:2012-06-04 10:28:19

标签: c# .net multithreading locking blockingcollection

我有System.Collections.Generic.List _myList并且许多线程可以从中读取或同时向其添加项目。根据我的阅读,我应该使用'BlockingCollection',这样就行了。我还阅读了关于ReaderWriterLockSlimlock的内容,但我不知道如何使用它们代替BlockingCollection,所以我的问题是我可以这样做:

  1. ReaderWriterLockSlim
  2. 而不是使用'BlockingCollection'。如果是,您能否提供简单示例以及使用BlockingCollectionReaderWriterLockSlimlock的优缺点?

    已更新 读者不仅仅是作家!

2 个答案:

答案 0 :(得分:5)

ReaderWriterLockSlim

  • 针对用例进行了优化,当来自资源的读取比写入更频繁地发生时;
  • 可以使用任何类型的资源(不仅仅是集合),因为它只是一个混合同步构造。

lock

  • 是一个通用的,相当简单的混合同步结构,没有任何优化;因此,会使性能变差;
  • Monitor class;
  • 周围的C#包装器
  • 可以使用任何类型的资源;

BlockingCollection

  • 是一种特定类型的集合(具体的资源类型),旨在解决“生产者 - 消费者”的任务;
  • 支持超时和取消机制(通过取消令牌),这使得更容易集成到使用TPL的代码中。

我认为,你的选择是BlockingCollection(如果你真的有很多读者和作家)。

答案 1 :(得分:2)

如果您经常突变列表,那么ReaderWriterLockSlim可能无法帮助您,因为它只允许单次写访问,lock开销较小。就个人而言,在每次访问期间,我只会lock(在一些锁定对象上)。

BlockingCollection的问题在于它只保证单个操作是原子的 - 但是,我们经常需要将多个操作作为一个单元执行(不仅仅是{{1等等)。所以为了避免疯狂,TryAdd更简单。

另一个优点是lock的使用非常简单:

lock

(它还通过lock(syncLock) { // do stuff with the list } Monitor.Wait建立内置信号,这很不错)