【问题标题】:Fastest way to pass data between threads在线程之间传递数据的最快方法
【发布时间】:2013-12-24 11:55:42
【问题描述】:

我不是在询问使用后台工作者或线程池或 TPL 的最惯用方式。

我试图找出在使用 .NET 将数据从一个线程传递到另一个线程时最快的方法

我目前正在使用带有写入索引和读取索引的环形缓冲区。 这样,除了更新读/写索引的原子操作外,我根本没有任何线程同步。 (我不是 100% 确定,但是整数的读取和 ++ 在 .NET 中是原子的,对吗?或者当一个线程读取整数时,整数是否可以在中途被覆盖?)

                         Write Index
                              V
index 0 [_][_][_][_][_][_][_][_][_][_][_] --> higher index
               ^
           Read Index

在线程间通信方面,这是一种合理的方法吗?

我没有将它用于任何实际项目,我只是想更好地掌握这里哪些有效,哪些无效。

[编辑] 好的,我愿意公开羞辱:

https://gist.github.com/rogeralsing/8121376

这段代码有多少漏洞?

【问题讨论】:

  • 这就像正则表达式,现在你有两个问题。您无法可靠地判断缓冲区何时已满,您无法阻止生产者,也无法在缓冲区为空时阻止消费者。有一种惯用的方式,但你不想听。
  • @RogerAlsing 标准整数运算不是原子的。
  • @HansPassant 我知道有一些惯用的方法,我一直在将 TPL 用于各种事情,我只是想看看对于特定用例什么是可能的,什么不是。如前所述,我没有将它用于任何真实的事情,只是在学习。
  • ++ 是原子的。不过你可以使用Interlocked.Increment...
  • 如果您有自己认为有效的代码并希望对其进行审查,您可以考虑codereview.stackexchange.com

标签: .net multithreading task-parallel-library disruptor-pattern


【解决方案1】:

我认为这取决于您如何定义“最快”和“线程之间”。 我认为ConcurrentBag<T> 是一个非常好的方式。如果我没记错的话,该实现使用某种链表来减少大多数锁的范围,因此它变得更具可扩展性。 2个简单线程之间是否很快?您需要检查,但它会利用您的内核,因此您的应用程序作为一个整体将运行得很快。

【讨论】:

  • AFAIK, ConcurrentBag 针对同一线程既是生产者又是消费者的情况进行了优化。对于从一个线程发送到另一个线程,我相信ConcurrentQueue 会更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 2021-07-28
相关资源
最近更新 更多