【问题标题】:How can I write to a vector with one process and read it with another without performance loss如何使用一个进程写入向量并使用另一个进程读取它而不损失性能
【发布时间】:2012-07-03 13:03:49
【问题描述】:

我有一个向量,它通过我编写的用于收集信息的过程不断更新(大约每秒 5-20 次)新信息。我想编写一个能够检测向量变化的循环,然后读取信息并进行我为该事件编写的适当分析。但是,我知道像这样的多线程会产生很多问题,所以我很好奇做这种事情的最佳方法是什么。

该向量存储在一个公共类中,并且正在通过我们从金融公司获得的提要进行更新(正在更新的信息是期货指数)。

【问题讨论】:

  • 为了澄清一些困惑,你能解释一下你的架构吗?这是具有多线程的单个进程还是多个进程?
  • 很抱歉,这是多个进程。那是我的错。
  • 在进程之间共享数据结构通常(但不总是)比值得的麻烦更多。您可能会更好,例如让您的收集过程将一系列更改写入其自己的标准输出,然后您的分析过程读取它们。这样,您就可以将进程间数据共享的问题转变为确保收集进程永远不会因为其标准输出缓冲区已满而被阻塞的问题。仍然不是微不足道的,但通常是一个更容易的问题。
  • 也许您可以使用boost::asio 异步更新提要数据
  • 您是否考虑过如何实现 IPC(进程间通信)(共享内存、原始 TCP/IP、命名管道、标准输出、COM、CORBA 等...)?这很可能会影响您将数据读/写到共享结构的方式。

标签: c++ multithreading ipc


【解决方案1】:

我没有看到在 C++ 中执行此操作的方法。如果您使用共享内存,您可以将 vector 存储在其中,但它的组件仍将指向本地的非共享内存块,从而阻止它被共享(您可能能够工作使用分配器技巧,但我不确定它是否有效)。

boost 具有一些共享内存功能,但正如我从一个问题中回忆的那样,我找不到它有一些缺点。您很可能必须设计自己的共享内存数据结构并提供一种机制来在其中存储条件变量,以便客户端可以等待它来确定何时有新数据可用。

编辑:我发现了关于boost::interprocess的问题:

Is boost::interprocess ready for prime time?

【讨论】:

【解决方案2】:

抱歉,在这种情况下,我建议更改设计:将向量设为私有,添加一个 Setter 函数(包装 push_back() 或其他)供您的数据馈送使用,然后您就完成了。 还是我错过了什么?

【讨论】:

  • 我认为您错过了单独进程正在读取数据。
  • 我不确定 OP 是否真的有单独的进程。我认为他的意思是线程......
  • 他已经确认他的意思是进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多