我知道有些类似的问题已经得到解答,但我提出这个问题,因为它们没有给出我想知道的东西。这是关于线程之间的同步。我项目的思想是从数据采集卡中获取数据,并在数据采集过程中绘制和分析数据。到目前为止,我只在一个线程上有一个用于数据采集的类,而在另一个线程上只有一个用于绘图的类。数据采集类将数据存储在全局循环缓冲区中,绘图类从全局缓冲区复制数据,并执行一些绘制过程(数据点的缩减等)。我认为这就是所谓的(单一)生产者-(单一)消费者问题。我使用两个信号量成功地完成了这个部分,它跟踪获取类存储了多少个数据点,以及绘图类使用了多少个数据点。
现在,我想在另一个线程上介绍另一个分析数据的类。然后,我会有一个制片人和两个消费者。我想提出以下条件:
我处理第一部分(单一生产者和单一消费者)的方式似乎没有直接扩展到第二部分(单一生产者和两个消费者)。我在想我该怎么做。我使用C++和Qt进行线程处理,因为我对GUI使用了Qt。但是,解决方案不一定要与Qt一起使用。但是,如果可能的话,将非常感谢示例码或伪码。我发现了一个与我的问题here 类似的线程)。建议使用boost::interprocess。但是,由于我以前从未使用过Boost库,而且尽管我已经阅读过关于boost::interprocess的文档,但是它看起来太复杂了,无法自己弄清楚。
非常感谢!
大辅
发布于 2010-10-01 14:29:37
如果两个使用者都需要查看所有数据项,那么最好为每个使用者提供一个缓冲区。然后,生产者可以将相同的数据发送到每个缓冲区。如果您关注以这种方式加倍数据的内存需求,并且数据没有被使用者修改,那么您可以使用引用计数指针(如boost::shared_ptr ),并将指向数据的指针发送到每个缓冲区。这样,数据项是共享的,但是读取器可以独立地处理数据。
让生产者日志覆盖一些数据应该是非常简单的事情。
发布于 2010-10-01 13:30:33
我认为您应该阅读Herb的以下并发性文章,以了解您应该如何构造事物以及如何实现可伸缩性(如果这是目标的话)。下面的链接是最新的文章,但也包含前几篇文章的完整列表。
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/
https://stackoverflow.com/questions/3839177
复制相似问题