首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程间共享数据数组-C++

线程间共享数据数组-C++
EN

Stack Overflow用户
提问于 2010-10-01 12:37:31
回答 2查看 3.4K关注 0票数 3

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

现在,我想在另一个线程上介绍另一个分析数据的类。然后,我会有一个制片人和两个消费者。我想提出以下条件:

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

我处理第一部分(单一生产者和单一消费者)的方式似乎没有直接扩展到第二部分(单一生产者和两个消费者)。我在想我该怎么做。我使用C++和Qt进行线程处理,因为我对GUI使用了Qt。但是,解决方案不一定要与Qt一起使用。但是,如果可能的话,将非常感谢示例码或伪码。我发现了一个与我的问题here 类似的线程)。建议使用boost::interprocess。但是,由于我以前从未使用过Boost库,而且尽管我已经阅读过关于boost::interprocess的文档,但是它看起来太复杂了,无法自己弄清楚。

非常感谢!

大辅

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-01 14:29:37

如果两个使用者都需要查看所有数据项,那么最好为每个使用者提供一个缓冲区。然后,生产者可以将相同的数据发送到每个缓冲区。如果您关注以这种方式加倍数据的内存需求,并且数据没有被使用者修改,那么您可以使用引用计数指针(如boost::shared_ptr ),并将指向数据的指针发送到每个缓冲区。这样,数据项是共享的,但是读取器可以独立地处理数据。

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

票数 2
EN

Stack Overflow用户

发布于 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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3839177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档