c++ - 在 C++ 中跨程序共享指针

标签 c++ shared-memory

这与之前的帖子有关:

Allocating a large memory block in C++

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

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

最佳答案

共享内存 是您绝对可以用来共享对矩阵 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/

相关文章:

c++ - 具有无效函数类型或数组类型参数的 SFINAE?

python - 在不移动数据的情况下在进程之间共享数据

window - 如何在 xcb 中使用 shm pixmap?

c++ - Windows 10 是否会防止您访问其他程序正在使用的内存?

c++ - 共享内存 IPC 同步(无锁)

c++ - shared_ptr 对象的析构函数从未被调用

c++ - Xcode 5.1 std::string 连接在发布版本中的 iOS 5.1 设备上崩溃

c++ - 查找文件末尾的问题?

C++ 如何加入多播 mpeg 流?

c - 尽管再次使用 O_CREAT,但以相同名称重新打开时 shm_open() 失败