【问题标题】:Fastest IPC method on Windows 7Windows 7 上最快的 IPC 方法
【发布时间】:2011-10-30 22:22:22
【问题描述】:

Windows 7 上最快的进程间通信 (IPC) 方法是什么?我们只想共享一个内存块(双向)。

ReadProcessMemory 还是别的什么? 我们想使用普通的C,但是,例如,Boost 库在 IPC 中使用什么?

【问题讨论】:

    标签: c++ c windows boost ipc


    【解决方案1】:

    ReadProcessMemory 甚至不应该被列为 IPC 方法;是的,它可以这样使用,但它主要用于调试目的(如果您检查它的引用,它在“调试功能”类别下),它肯定比“真实”共享内存慢,因为它副本 将进程的内存放到指定的缓冲区中,而真正的共享内存没有这个开销。

    Windows 支持的 IPC 方法的完整列表可见on the MSDN;尽管如此,如果你只有两个应用程序想要共享一个内存块,你应该创建一个命名的内存映射文件(由页面文件支持)CreateFileMapping/MapViewOfFile,这应该是最直接和最快的方法.文件映射的细节在 MSDN 上的its page 有描述。

    relevant Boost IPC classes 可以充当共享内存的瘦包装器,AFAIK 它只封装了对相关系统特定 API 的调用,但最终你会得到指向共享内存块的通常指针,所以操作应该是与使用原生 API 一样快。

    因此,我建议您使用Boost.Interprocess,因为它是可移植的、C++ 友好的(它提供 RAII 语义)并且在创建共享内存块后不会给您带来任何性能损失(它可以 在共享内存上提供额外的功能,但它们都是可选的 - 如果你只想要共享内存,你就可以得到它)。

    【讨论】:

    • stackoverflow.com/q/5140312 对 Windows 上的 Boost.Interprocess 提出了一些担忧。你知道如果进程崩溃可能无法删除文件是真的吗?
    • 据我所知,他们基本上以与在 POSIX 上相同的方式实现了跨进程互斥锁,即使用文件,与它共享“程序崩溃,锁定仍然存在”的经典问题地方”(加上总体上实施似乎草率)。无论如何,这和文件内存映射的事情完全没有关系,我认为可以毫无问题地使用。
    猜你喜欢
    • 2016-11-21
    • 2011-07-01
    • 2011-05-14
    • 1970-01-01
    • 2012-11-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多