Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在线程之间传递数据的最快方式_.net_Multithreading_Task Parallel Library_Disruptor Pattern - Fatal编程技术网

.net 在线程之间传递数据的最快方式

.net 在线程之间传递数据的最快方式,.net,multithreading,task-parallel-library,disruptor-pattern,.net,Multithreading,Task Parallel Library,Disruptor Pattern,我不是在问使用后台工作者、线程池或TPL的最惯用方式 我试图找出在使用.NET将数据从一个线程传递到另一个线程时,哪些方法最快 我目前正在使用一个带写索引和读索引的环形缓冲区。 这样,除了更新读/写索引的原子操作之外,我根本没有任何线程同步。 (我不是100%确定,但在.NET中读取整数和++是原子的,对吗?或者当一个线程读取一个整数时,它可以被中途覆盖?) 当涉及到线程到线程的通信时,这是一种合理的方法吗 我并没有在任何实际项目中使用它,我只是想更好地掌握什么是有效的,什么是无效的 [编辑]

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

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

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

当涉及到线程到线程的通信时,这是一种合理的方法吗

我并没有在任何实际项目中使用它,我只是想更好地掌握什么是有效的,什么是无效的

[编辑] 好吧,我准备公开羞辱:


代码中有多少漏洞?

我认为这取决于如何定义“最快”和“线程间”。 我认为
ConcurrentBag
是一种非常好的方式。如果我没记错的话,这个实现使用了某种链表来缩小大多数锁的范围,因此它变得更具可伸缩性。
两个简单线程之间的速度快吗?您需要进行检查,但它利用了您的核心,因此您的应用程序作为一个整体将运行得很快。

这就像regex一样,现在您遇到了两个问题。当缓冲区为空时,您无法可靠地判断缓冲区何时已满,无法阻止生产者,也无法阻止消费者。有一种惯用的方法,但你不想听。@Rogerasing标准整数运算不是原子的。@HansPassant我知道有惯用的方法,我一直在为各种事情使用TPL,我只是想看看什么是可能的,什么不是特定用例的。如前所述,我并没有用它来做任何真实的事情,只是学习而已。你可以使用<代码>互锁。递增< /代码>……如果你有代码,你相信它工作,你希望它被审查,你可以考虑。AFAIK,<代码>并发包被优化的情况下,当同一个线程既生产也消费。对于从一个线程发送到另一个线程,我相信
ConcurrentQueue
会更快。
                         Write Index
                              V
index 0 [_][_][_][_][_][_][_][_][_][_][_] --> higher index
               ^
           Read Index