【问题标题】:C++/CLI efficient multithreaded circular bufferC++/CLI 高效多线程循环缓冲区
【发布时间】:2009-12-15 12:28:29
【问题描述】:

我正在开发的 C++/CLI GUI 中有四个线程:

  1. 收集原始数据
  2. GUI 本身
  3. 一个后台处理线程,它获取大量原始数据并产生有用的信息
  4. 充当连接其他三个线程的控制器

我已经让原始数据收集器工作并将结果发布到控制器,但下一步是存储所有这些结果,以便 GUI 和后台处理器可以访问它们。

新的原始数据以固定(频繁)的时间间隔一次输入一个结果。 GUI 将在每个新项目到达时访问它(控制器宣布新数据,然后 GUI 访问共享缓冲区)。数据处理器将定期读取缓冲区的一块(例如一秒钟)并产生新的结果。如此有效,有一个生产者和两个消费者需要访问。

我四处寻找,但 CLI 提供的东西听起来都不是很有用,所以我正在考虑自己动手做。一个共享的循环缓冲区,它允许收集器的写锁和 gui 和数据处理器的读锁。只要缓冲区的这些部分没有被写入,这将允许多个线程读取数据。

所以我的问题是:.net 库中是否有任何简单的解决方案可以实现这一目标?我是否因为考虑自己滚动而生气?有更好的方法吗?

【问题讨论】:

    标签: multithreading synchronization c++-cli buffer


    【解决方案1】:

    是否可以将问题重新表述为:

    1. 收集器收集新数据点 ...
    2. ...它传递给控制器​​。
    3. 控制器触发 GUI “NewDataPointEvent” ...
    4. ...并将数据点存储在一个数组中。
    5. 如果阵列已满(或准备好处理),控制器将阵列发送到处理器...
    6. ...并开始一个新数组。

    如果线程之间传递的值在共享后没有被修改,这可能使您不再需要自定义线程安全集合类,并减少所需的锁定量。

    【讨论】:

    • 您在重复我的问题时是正确的。一旦控制器执行了快速过滤,数据就不会改变。您的建议可能有效,但 GUI 需要数据点的副本以及后台处理器。我想我只是担心我会在整个地方分配和释放内存。不过,我可以从它开始并对其进行分析,以查看在各处发送数据副本是否会减慢速度..
    • 如果您担心分配/释放内存,我建议您使用 2 个向量(一个用于生产者,一个用于消费者)。你可以交换它们,这是一个快速的操作。另外,如果你使用 resize(0) 而不是 clear,它们应该保持它们的容量,所以没有分配/重新分配......当然你必须把锁放在正确的地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多