在C ++中的程序之间共享指针

时间:2018-08-29 05:16:34

标签: c++ shared-memory

这与先前的帖子有关:

Allocating a large memory block in C++

我希望运行一个C ++服务器,该服务器生成一个巨大的矩阵M。然后,在同一台计算机上,我想运行可以与该服务器联系的其他程序,并获取M的内存地址。 M是只读的,服务器会创建一次。我应该能够产生一个客户端./test,并且该程序应该能够对M进行只读访问。服务器应始终处于运行状态,但是我可以随时运行其他程序,例如./test

我对C ++或OS不太了解,最好的方法是什么?我应该使用POSIX线程吗?矩阵是原始类型(doublefloat等),所有程序都知道其尺寸。客户端程序需要整个矩阵,所以我不希望从服务器到客户端的mem复制产生延迟,我只想直接共享该指针。我最好的选择是什么?

2 个答案:

答案 0 :(得分:2)

可以肯定地用于共享对矩阵M的直接访问的一种进程间通信机制是共享内存。这意味着OS可以通过为每个请求进行映射,让多个进程访问内存中的共享段,就像它在其地址空间中一样。满足您所有要求并且也是跨平台的解决方案是 boost :: interprocess 。它是一个薄的可移植层,包装了所有必要的OS调用。请参见here in the docs的工作示例。

本质上,您的服务器进程仅需要创建一个boost::interprocess::shared_memory_object类型的对象,为构造函数提供共享段的 name 。调用其truncate()方法时,操作系统将在此服务器进程的地址空间中寻找足够大的段。从这一刻起,任何其他进程都可以创建相同类型的对象并提供相同的 name 。现在它也可以访问完全相同的内存。不涉及副本。

如果由于某种原因您无法使用可移植的 Boost 库,或者由于其他原因想要将支持的平台限制为Linux,请在mmap() function周围使用POSIX API。这是Linux man page。用法基本上与上述 Boost 管道不远。您可以使用shm_open()创建命名段,并使用ftruncate()创建 truncate 。从那里开始,您可以通过调用mmap()接收到指向此分配空间的映射指针。在仅在父子进程之间共享的较简单情况下,可以使用this code example from this very website

当然,无论采用哪种方法,在使用共享资源时,请确保正确同步读/写,以避免出现任何竞争情况-就像在同一进程的多个线程的情况下所做的那样

答案 1 :(得分:0)

当然,其他程序不能访问矩阵,只要它在“正常”进程内存中即可。

无需质疑设计方法:是的,您必须使用共享内存。查找函数,如shmget(),shmat()等。然后,您无需将指针传递给另一个程序(实际上是行不通的),您只需在ftok()中到处使用相同文件即可访问共享内存。