【问题标题】:CircularBuffer highly efficient implementation (both thread-safe and not thread-safe) [closed]CircularBuffer 高效实现(线程安全和非线程安全)[关闭]
【发布时间】:2012-11-07 18:36:06
【问题描述】:

有人可以建议好的 CircularBuffer 实现吗?我需要“非线程安全”和“线程安全”版本。我期望以下操作:

  • 能够在创建时提供缓冲区大小
  • 添加元素
  • 迭代元素
  • 在迭代时删除元素
  • 可能会删除元素

我希望实现在速度和使用的内存、平均和最差时间等方面得到高度优化。

我希望“非线程安全”的实现速度非常快。我希望“线程安全”实现速度很快,可能使用“无锁代码”进行同步,如果需要速度,可以有一些限制。

如果缓冲区太小而无法存储新(添加)元素,则可以静默覆盖现有元素或引发异常。

我应该使用disruptor.net吗?

将链接添加到一个很好的例子Disruptor.NET example

【问题讨论】:

  • 是的,只要使用Disruptor.net 他们就有很好的效果。中断器是一个并发组件,用于在线程之间交换消息(生产者消费者)它针对高吞吐量和低延迟场景进行了优化。
  • 如果中断器在“非线程安全”场景中有效?我可以只使用常规的“数组”并自己编写休息方法
  • 当然,但你会建立自己的破坏者......我不会浪费我的时间......
  • 如果您可以添加“非线程安全”破坏者场景的示例,那将非常有用。到目前为止,我找到了code.google.com/p/disruptor-net/wiki/CodeExamples,但它包含“多线程”版本

标签: c#


【解决方案1】:

不是线程安全的:

System.Collections.Generic.Queue

线程安全:

System.Collections.Concurrent.ConcurrentQueue

System.Collections.Concurrent.BlockingCollection(内部默认使用并发队列)

Although technically you really shouldn't use the term "thread safe". 简直太模棱两可了。第一个不是为多个线程同时使用而设计的,其余的都是。

【讨论】:

  • 你认为 .net 队列正在使用环形缓冲区吗?
  • 这就是我想要真正的循环缓冲区的原因。我希望循环缓冲区根本不使用“新内存”。这在密集使用时非常方便。
  • -1 这是一个糟糕的答案,因为所提出的解决方案实际上都不是循环缓冲区(它们要么随意扩展,要么空间不足)
  • @piers7 是的,它们循环缓冲区。当它们用完空间并复制数据时,它们会创建一个新的循环缓冲区并不会使它们不是循环缓冲区。问题中没有要求所讨论的数据结构只能手动扩展,而不是永远或自动扩展。如果您自己有这样的要求,您可以提出自己的问题。
  • @Servy .NET 队列类不是循环缓冲区。它们在内部使用循环缓冲区,但它们本身不是循环缓冲区。圆形缓冲区根据定义是固定大小的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多