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

Sharing pointer across programs in C++

本文关键字:之间 共享 指针 程序 C++      更新时间:2023-10-16

这与之前的一篇文章有关:

在C++中分配大型内存块

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

我对C++或操作系统了解不多,最好的方法是什么?我应该使用 POSIX 线程吗?矩阵是一个基元类型(doublefloat等(,所有程序都知道它的维度。客户端程序需要整个矩阵,所以我不希望从服务器到客户端的mem复制延迟,我只想直接共享该指针。我的最佳选择是什么?

一种进程间通信机制,你绝对可以用来共享对矩阵M的直接访问,那就是共享内存。这意味着操作系统允许多个进程访问内存中的共享段,就像它位于其地址空间中一样,方法是为每个请求映射该段。一个满足你所有要求的解决方案,也是跨平台的,是boost::interprocess。它是一个薄的便携式层,包装所有必要的操作系统调用。请参阅文档中的工作示例。

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

如果由于某种原因您无法使用可移植的 Boost库,或者由于其他原因想要将支持的平台限制为 Linux,请在mmap()函数周围使用 POSIX API。这是 Linux 手册页。使用量基本上与上述Boost管道相差不远。使用shm_open()创建命名段,并使用ftruncate()。从那里开始,您可以通过调用mmap()来接收指向此分配空间的映射指针。在更简单的情况下,您只会在父进程和子进程之间共享,您可以使用此网站上的此代码示例。

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

当然,只要矩阵在"正常"进程内存中,其他程序就无法访问矩阵。

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