c++ - IPC的实现方式

标签 c++ windows multithreading ipc

在 Windows 上实现 IPC 的首选方法是什么?

我知道几个类似的:命名管道、共享内存、信号量? ,也许是 COM(虽然我不确定如何)...

我想知道什么是最健壮、最快速、最不容易出错且易于维护/理解的。

最佳答案

几年前,我们针对客户端/服务器情况研究了这个特定问题,客户端和服务器都在同一台机器上运行。当时,即使客户端和服务器位于同一台机器上,我们也使用套接字 (UDP)。对我们来说,“最好”原来是共享内存与命名信号量来同步它。当时,我主要研究管道与原始共享内存实现的对比。我测试了具有重叠 I/O 和 I/O 完成端口的管道。

我测试了多种数据大小。在客户端和服务器来回回显 1 个字节的低端,原始共享内存实现是最快的 3 倍。当我来回传递 10,000 个字节时,管道实现和原始共享内存实现都是速度差不多。如果我对共享内存的实现没记错的话,我使用的是 4K 缓冲区。

对于所有数据大小,共享内存测试比使用套接字快 2 到 6 倍(与 TCP 相比)。

在管道实现之间,当传递少量数据时,重叠 I/O 版本比 I/O 完成端口版本快大约 30%。同样,对于更大的数据 block ,差异很小。

管道实现的代码当然要简单得多。但是我们处理了相当多的来回传递的小数据 block ,因此值得额外的复杂性来实现具有命名信号量的共享内存版本。

当然,如前所述,这是几年前的事了,您不知道我是否正确实现了所有不同的测试。另请注意,这是针对单个客户端的。我们共享内存通信的最终实现确实可以很好地扩展数百个运行的“客户端”。但我不知道在那个规模上它是否比管道实现更好。

关于c++ - IPC的实现方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1911203/

相关文章:

c++ - fread 在 OpenMP 线程中性能低下

java - 使用 Cipher 和 AES 解密产生 208 个解密字节,后跟垃圾

java - 在 Spring Web 服务器中创建线程以运行超时任务

c# - 如何在多线程中使用字符串

java - JOptionPane 打开时是否可以暂停当前线程?

c++ - 我在 Visual Studio 2012 Pro 中有一个 C++ DLL 类型的项目,但我无法将其编译为 CLR - 为什么会这样?

c++ - 如何使用函数指针作为参数初始化模板的静态成员

c++ - 列表框上下文菜单

windows - 计算文件中未知字符串最常见的出现次数

windows - 在 ZABBIX 代理窗口中使用 JBOSS 7.1 JMX 进行监控