【问题标题】:Circular buffer with two indexes具有两个索引的循环缓冲区
【发布时间】:2015-09-16 13:27:13
【问题描述】:

我想做一个有两个索引的循环缓冲区:

  • WriteIndex(由第一个线程控制)将新值写入缓冲区
  • ReadIndex(由第二个线程控制)从缓冲区读取值并分析它

那么,当两个索引位于同一位置时,如何暂停线程。 我的意思是,如果你没有写入任何新数据,你就无法读取它,所以如果 writeindex 和 readindex 在同一位置,你只需要写入新数据,而不是读取它。

如何阻塞线程直到发生某些事情?

【问题讨论】:

  • 您真的需要一个循环缓冲区还是任何有界线程安全集合都需要?
  • 我真的不需要它,但我需要暂时保存一些数据。我正在通过 FTD2XX_NET 从设备读取字节,然后我试图找到网络数据包,检查 CRC 等。所以第一个线程应该通过 FTDI 读取数据并将它们保存到缓冲区,第二个线程应该读取缓冲区并寻找网络数据包我希望你能理解我。我很难形容^^

标签: c# multithreading circular-buffer


【解决方案1】:

您要查找的内容已经在 BCL 中:BlockingCollection<T>

它是线程安全的:它有一个 Add() method 来添加项目,还有一个阻塞 Take() method 在项目可用之前阻塞(“暂停调用线程”)。

正如现在已删除的评论中所提到的:这确实不是一个真正的循环缓冲区,一旦达到最大值,就会处理或覆盖项目。您可以设置集合大小的上限;这将使Add() 阻塞,直到有更多空间。

【讨论】:

  • 注释已被删除,因为 OP 并不真正想要一个循环缓冲区。一个有上限的 BlockingCollection 就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2020-05-17
相关资源
最近更新 更多