ConcurrentBag(T)是否针对单线程场景进行了优化?如果是这样,为什么同时?

时间:2011-01-31 07:19:35

标签: .net multithreading collections concurrency

.NET 4.0并发集合库中ConcurrentBag<T>类的MSDN文档说明了这一点:

  

ConcurrentBag是一个线程安全的包   实施,优化   相同线程的场景   同时生产和消费数据   存放在包中。 [强调我的]

我是否遗漏了某些内容,或者这是说ConcurrentBag<T>类针对单线程方案进行了优化?

如果我错过了什么......为什么会这样?有一个集合设计用于并发,但优化用于一个线程,这似乎很奇怪。

3 个答案:

答案 0 :(得分:1)

文档试图说的是它更喜欢生成和使用数据的相同线程。

它有一个快速路径,当同一个线程生成并使用数据时,数据保留在该线程上(想想[ThreadStatic])。但是,当在同一个线程上没有要使用的数据时,它会查看其他线程并从那里获取数据。

看看,例如在http://www.codethinked.com/post/2010/01/27/NET-40-and-System_Collections_Concurrent_ConcurrentBag.aspx获得更详细的解释。

答案 1 :(得分:1)

优化意味着,如果你有多个生产和消费的线程,那么就有优化,如果它可以返回由同一个线程放在包中的项目,那么它是最快的。

这种优化不适用的地方是,如果一个线程要求袋子找到一个物品,那么该口袋中没有剩下的物品放在那里。在这种情况下,它仍然可以从包中检索一个项目(由另一个线程放在那里),但它不太理想。


或者,换句话说:它是并发的,因为多个线程可以生成并同时从中消耗,无需外部锁定。提到的优化不会使这不真实。

答案 2 :(得分:1)

您可以使用ConcurrentBag的三种情况以及此优化如何影响它们:

1)单独的生产者和消费者线程。没效果。

2)作为消费者和生产者的线程存储和检索来自ConcurrentBag的数据。优化将提高相同线程添加/检索操作的性能。

3)可以使用常规集合的单线程场景。优化意味着使用ConcurrentBag的开销很小,因此您可以使用它而不会产生巨大的性能损失。