【问题标题】:Best way for interprocess communication in C++C++中进程间通信的最佳方式
【发布时间】:2010-09-27 04:43:38
【问题描述】:

我有两个进程,一个会查询另一个进程的数据。在有限的时间内(每秒 10000 次)会有大量查询,每秒将传输数据(>100 mb)。数据类型将是一个整体类型(双,整数) 我的问题是通过哪种方式连接这个过程?

共享内存、消息队列、lpc(本地过程调用)或其他......

我也想问一下你推荐哪个库?顺便说一句,请不要建议 MPI。 编辑:在 windows xp 32 位下

【问题讨论】:

    标签: c++ memory boost ipc shared


    【解决方案1】:

    一句话:Boost.InterProcess。如果它真的需要快速,共享内存就是要走的路。您的开销几乎为零,因为操作系统在虚拟地址和物理地址之间进行通常的映射,并且不需要复制数据。您只需要注意并发问题。

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

    【讨论】:

    • 小心:在 Windows >= Vista 上,UIPI 阻止低完整性访问高完整性进程。例如,较低完整性的进程不能发送窗口消息或挂钩或附加到较高优先级的进程。
    • 似乎同样的问题会影响 Windows 上的 Boost::Interprocess(截至 1_51),即您不能使用 boost::interprocess::message_queue 对象将消息从低权限发送到高权限。
    • 我之前的评论是错误的:为了将消息从low-priv发送到high-priv(即允许low-priv打开由high-priv创建的队列),必须设置适当的权限对象,见this
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我会赞同 Marc 的建议——除非您有可移植性问题或想做一些很酷的事情,例如在共享内存上映射标准容器类型(在这种情况下,我肯定会使用 boost)。

      否则,消息队列和共享内存很容易处理。

      【讨论】:

        【解决方案4】:

        如果您的数据包含多种类型和/或您需要诸如互斥锁之类的东西,请使用 Boost。 否则,使用#pragma data_seg 或内存映射文件来使用内存的共享部分。

        【讨论】:

          【解决方案5】:

          如果您确实使用共享内存,您将不得不决定是否旋转。我希望如果您使用信号量进行同步并将数据存储在共享内存中,与使用消息队列相比(在清晰度显着下降),您不会获得太多性能优势,但是如果您使用原子变量进行同步,那么您必须承担后果。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-20
            • 2018-05-31
            • 2015-09-03
            • 2015-08-10
            • 1970-01-01
            相关资源
            最近更新 更多