3

我知道已经回答了类似的问题,但我问这个问题是因为它们并没有完全给出我想知道的内容。这是关于线程之间的同步。我的项目的想法是我们从数据采集卡中获取数据,并在数据采集过程中绘制和分析数据。到目前为止,我只有一个线程上的数据采集类和另一个线程上的绘图类。数据采集​​类将数据存储在全局循环缓冲区中,绘图类从全局缓冲区复制数据并进行一些绘图处理(减少数据点等)。这就是我认为所谓的(单一)生产者-(单一)消费者问题。

现在,我想在另一个分析数据的线程上介绍另一个类。然后,我将有一个生产者和两个消费者。我想施加以下条件:

  1. 两个阅读器共享相同的数据集。即,每个生产的项目必须由两个阅读器使用,而不是仅由其中一个阅读器使用。
  2. 当缓冲区已满时,数据采集类将覆盖全局缓冲区。当读取器由于数据采集类覆盖缓冲区而丢失数据时,必须检测到这一点,理想情况下,将其保存在日志中(例如,读取器遗漏了哪些数据部分) )。
  3. 分析类的计算可能很密集。为此,我可能需要在分析类中使用更大的数据缓冲区。

我处理第一部分(单个生产者和单个消费者)的方式似乎并没有直接扩展到第二部分(单个生产者和两个消费者)的情况。我想知道我应该如何进行。我使用 C++ 和 Qt 进行线程处理,因为我使用 Qt 作为 GUI。但是,解决方案不一定必须使用 Qt。但是,如果可能,将不胜感激示例代码或伪代码。我在这里找到了与我的问题类似的线程)。建议使用 boost::interprocess。然而,由于我以前从未使用过 Boost 库,而且虽然我已经阅读了有关 boost::interprocess 的文档,但它看起来太复杂了,无法弄清楚我自己。

非常感谢!

大辅

4

2 回答 2

2

如果两个消费者都需要查看所有数据项,那么为每个消费者设置一个缓冲区可能会更好。然后,生产者可以将相同的数据发布到每个缓冲区中。如果您担心以这种方式将数据翻倍的内存需求,并且消费者不会修改数据,那么您可以使用引用计数指针,例如boost::shared_ptr,并将指向数据的指针发布到每个缓冲区中。这样数据项是共享的,但读者可以独立处理数据。

让生产者记录它已经覆盖了一些数据应该很简单。

于 2010-10-01T14:29:37.567 回答
0

我认为您应该阅读 Herb Sutter 的以下并发文章,以了解您应该如何构建事物以及如何可扩展(如果这是一个目标)。下面的链接是最新文章,但也包含以前文章的完整列表。

http://herbsutter.com/2010/09/24/effective-concurrency-know-when-to-use-an-active-object-instead-of-a-mutex/

简而言之,您应该尽可能为每个线程制作数据副本,以减少对实际资源的争用,而不是将所有内容都包装在互斥体中。这篇文章就是关于这个的。

http://herbsutter.com/2008/05/23/effective-concurrency-maximize-locality-minimize-contention/

于 2010-10-01T13:30:33.900 回答