【发布时间】: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