在threads-C ++中共享数据数组

时间:2010-10-01 12:37:31

标签: c++ multithreading circular-buffer

我知道有类似的问题已经得到解答,但我问这个问题,因为他们并没有完全给出我想知道的内容。 这是关于线程之间的同步。我的项目的想法是我们从数据采集卡获取数据,并在数据采集过程中绘制和分析数据。到目前为止,我只有一个用于在一个线程上进行数据采集的类和一个用于在另一个线程上进行绘图的类。数据采集​​类将数据存储在全局循环缓冲区中,并绘制类从全局缓冲区复制数据并执行一些绘制过程(减少数据点等)。这就是我认为的(单一)生产者(单一)消费者问题。我已经设法使用两个信号量来完成这一部分,这两个信号量跟踪采集类存储了多少数据点以及绘图类使用了多少数据点。

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

  1. 两个阅读器共享相同的数据集。即,每个生产的项目 必须由两位读者使用, 而不只是其中一个。
  2. 当缓冲区变满时,数据采集类将被覆盖 全局缓冲区。当。。。的时候 读者因数据而丢失数据 通过覆盖缓冲区 数据采集​​类,这必须 被检测到,并且理想情况下,保持在 日志(例如,什么部分 readear(s)错过了数据。
  3. 分析的计算 上课可能是密集的。为了这, 我可能需要一个更大的数据缓冲区 分析课。
  4. 我处理第一部分(单一生产者和单一消费者)的方式似乎没有以直接的方式扩展到第二部分(单一生产者和两个消费者)的情况。我想知道我该怎么做。 我使用C ++和Qt进行线程化,因为我使用Qt进行GUI。但是,解决方案不一定与Qt一致。但是,如果可能,将非常感谢样本代码或伪代码。我找到了一个与我的问题类似的线程here )。建议使用boost :: interprocess。但是,因为我之前从未使用过Boost库,虽然我已经阅读过有关boost :: interprocess的文档,但它看起来太过于难以理解我自己。

    非常感谢!

    大辅

2 个答案:

答案 0 :(得分:2)

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

让生产者日志覆盖一些数据应该是非常简单的。

答案 1 :(得分: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/