这与之前的帖子有关:
Allocating a large memory block in C++
我想要一个运行的 C++ 服务器生成一个巨大的矩阵 M
。然后,在同一台机器上,我想运行其他可以联系该服务器的程序,并获取 M
的内存地址。 M
是只读的,服务器创建一次。我应该能够生成客户端 ./test
并且该程序应该能够对 M
进行只读访问。服务器应该始终处于运行状态,但我可以随时运行其他程序,例如 ./test
。
我不太了解 C++ 或操作系统,最好的方法是什么?我应该使用 POSIX 线程吗?矩阵是原始类型(double
、float
等),所有程序都知道它的维度。客户端程序需要整个矩阵,所以我不希望从服务器到客户端的内存复制有延迟,我只想直接共享该指针。我的最佳选择是什么?
最佳答案
共享内存 是您绝对可以用来共享对矩阵 M
的直接访问的一种进程间通信机制。这意味着操作系统允许多个进程访问内存中的共享段,就好像它在它们的地址空间中一样,通过为每个请求映射它。 boost::interprocess 是一个可以满足您所有需求并且跨平台的解决方案。它是一个薄的可移植层,包装了所有必要的操作系统调用。查看右侧的工作示例 here in the docs .
本质上,您的服务器进程只需要创建一个boost::interprocess::shared_memory_object
类型的对象,为构造函数提供共享段的名称。当调用其 truncate()
方法时,操作系统将在此服务器进程的地址空间中寻找足够大的段。从这一刻起,任何其他进程都可以创建相同类型的对象并提供相同的名称。现在它也可以访问完全相同的内存。不涉及拷贝。
如果出于某种原因您无法使用可移植的 Boost 库,或者出于其他原因想要将受支持的平台限制为 Linux,请使用 mmap()
function 附近的 POSIX API .这是 Linux man page .用法基本和上面介绍的Boost流水线相差无几。您使用 shm_open()
创建命名段并使用 ftruncate()
创建 truncate。从那里开始,您可以通过调用 mmap()
接收指向此分配空间的映射指针。在您仅在父进程和子进程之间共享的更简单的情况下,您可以使用 this code example from this very website .
当然,无论您采用何种方法,在使用共享资源时,请确保正确同步读/写以避免任何竞争条件——就像您在同一进程的多个线程场景中所做的那样.
关于c++ - 在 C++ 中跨程序共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52069911/