代码之家  ›  专栏  ›  技术社区  ›  REALFREE

C++中父进程与子进程的共享队列

  •  0
  • REALFREE  · 技术社区  · 15 年前

    我知道有很多方法可以处理两个进程之间的交互通信,但是我仍然有点困惑如何处理它。是否可以高效地在两个进程之间共享队列(来自标准库)?

    谢谢

    3 回复  |  直到 15 年前
        1
  •  2
  •   David Rodríguez - dribeas    15 年前

    简单答案:共享 std::queue 通过两个过程可以完成,但这并不简单。

    您可以使用共享内存将队列与某些同步机制(通常是互斥)保持在一起。注意不仅是 STD::排队 对象必须在共享内存区域以及队列的内容中构建,因此您必须提供自己的分配器来管理共享区域中内存的创建。

    如果可以,请尝试查看更高级别的库,这些库可能为流程通信需求提供已经打包的解决方案。考虑 Boost.Interprocess 或者在您最喜欢的搜索引擎中搜索进程间通信。

        2
  •  3
  •   4dan    15 年前

    我相信您的困惑来自于不理解父进程和子进程的内存地址空间之间的关系。这两个地址空间实际上是不相关的。是的,在fork()之后,两个进程包含几乎相同的内存副本,但您应该将它们视为副本。一个进程对其地址空间中的内存所做的任何更改都不会影响另一个进程的内存。

    任何“普通的旧数据结构”(如C++标准库提供的)都是纯粹的内存抽象,所以没有办法使用它们来在这两个进程之间进行通信。要将数据从一个进程发送到另一个进程,必须使用提供进程间通信的多个系统调用之一。

    但是,请注意,共享内存是一个例外。可以使用系统调用设置共享内存的一部分,然后在共享内存中创建数据结构。您仍然需要使用互斥体来保护这些数据结构,但是互斥体必须具有共享内存的意识。对于POSIX线程,您将使用pthread_mutexattr_init和pthread_process_shared属性。

        3
  •  1
  •   Mark Wilkins    15 年前

    我不认为有任何简单的方法可以在两个项目之间共享这样的结构/对象。如果要在两个进程之间实现一个队列/列表/数组等,则需要在进程之间实现某种通信,以管理队列和检索和存储条目。

    例如,您可以在一个进程中实现队列管理,并实现某种类型的IPC(共享内存、套接字、管道等),以将条目从一个进程传递到另一个进程。

    在标准C++库之外可能有其他方法来为您这样做。例如,可能存在已经实现此功能的增强库。