要MultiThread还是不MultiThread?

Roy*_*mir 5 c# multithreading .net-4.0

让我们说一个FIFO(一个线程安全的)有项目添加到它(我们不关心如何)

|__|  |
|  |  |
|__|  |
|  |  |
|__|  V
| d|
|__|
| c|
|__|
| b|
|__|
| a|
Run Code Online (Sandbox Code Playgroud)

现在让我们说应该将项目(逐个)插入到 另一个并发集合中.

数据插入速率是动态的.

我想以最快的方式做到这一点.(将所有元素从转移Fifocollection).

但是我遇到了冲突:

  • 我可以使用一个线程从中拉出项目Fifo并将它们插入到collection.但后来我不会使用核心/其他可以帮助我的线程.

  • 我可以使用几个消费者线程来获取项目Fifo,但随后可能是内部锁定Fifo(在读取时),而内部锁定collection(写入时)最终会降低性能.

我的意思是,如果我拥有巨大的消费者线程,那么将会有巨大的内部锁定与fifo /集合,以及许多上下文切换

我怎样才能以正确的方式解决这类问题?准则是什么?

Tud*_*dor 1

多个线程竞争同一个并发集合将始终是瓶颈情况。线程越多,问题通常会变得更严重,但退化的速度取决于锁定机制。我期望 .NET 4.0 中新的并发集合是无锁的,或者至少使用非阻塞锁,因此它们应该在一定程度上是争用友好的。

由于这个问题似乎是开放式的,我建议您简单地尝试不同数量的线程,并在 fifo 争用和您想要实现的吞吐量之间找到平衡。