在C++中实现进程间通信的最佳方式

47
我有两个进程,其中一个会向另一个查询数据。在有限时间内将有大量查询(每秒10,000次),每秒将传输数据(>100 mb)。数据类型为整数类型(double、int)。
我的问题是如何连接这些进程? 使用共享内存,消息队列,本地过程调用(LPC)或其他方法...
此外,我想问你推荐哪个库?顺便说一下,请不要推荐MPI。 编辑:在Windows XP 32位系统下。
5个回答

49

一句话: Boost.InterProcess。如果真的需要快速,共享内存是最好的选择。由于操作系统执行虚拟地址和物理地址之间的常规映射,并且不需要数据复制,因此几乎没有任何开销。您只需要注意并发问题。

对于实际发送像shutdownquery这样的命令,我会使用消息队列。以前我使用本地主机网络编程来实现这一点,并使用手动共享内存分配,在了解boost之前。该死的,如果我需要重新编写应用程序,我会立即选择boost。Boost.InterProcess使这更容易。看一下吧。


请注意:在Windows >= Vista上,UIPI会阻止低完整性进程访问高完整性进程。例如,低完整性进程无法发送窗口消息或挂钩或附加到优先级更高的进程。 - Alex
似乎相同的问题也影响了Boost::Interprocess(截至1_51)在Windows上,即您无法使用boost :: interprocess :: message_queue对象从低权限发送消息到高权限。 - Alex
3
我的先前评论是错误的:为了从低权限发送消息到高权限(即允许低权限打开由高权限创建的队列),必须设置适当的权限对象,请参见 此处 - Alex

7
我会使用共享内存来存储数据,使用消息队列发送查询。

4
如果您的数据包含多种类型和/或需要使用互斥锁等功能,请使用Boost。 否则,可以使用#pragma data_seg共享内存段或内存映射文件。

4

我支持Marc的建议-如果你没有可移植性问题或者想要实现标准容器类型映射共享内存等酷炫功能,则不必使用boost(在这种情况下我肯定会使用boost)。

否则,消息队列和共享内存处理起来非常简单。


3

如果您使用共享内存,您必须决定是否自旋。如果您使用信号量进行同步并在共享内存中存储数据,与使用消息队列相比,我预计您不会获得太多性能优势(但会有明显的清晰度降低),但如果您自旋在原子变量上进行同步,则必须承受其后果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接