在C++中的程序之间共享指针
Sharing pointer across programs in C++
这与之前的一篇文章有关:
在C++中分配大型内存块
我想要一个运行C++服务器,生成一个巨大的矩阵M
.然后,在同一台机器上,我想运行可以联系该服务器的其他程序,并获取M
的内存地址。M
是只读的,服务器创建一次。我应该能够生成一个客户端./test
并且该程序应该能够对M
进行只读访问。服务器应该始终运行,但我可以随时运行其他程序,例如./test
。
我对C++或操作系统了解不多,最好的方法是什么?我应该使用 POSIX 线程吗?矩阵是一个基元类型(double
、float
等(,所有程序都知道它的维度。客户端程序需要整个矩阵,所以我不希望从服务器到客户端的mem复制延迟,我只想直接共享该指针。我的最佳选择是什么?
一种进程间通信机制,你绝对可以用来共享对矩阵M
的直接访问,那就是共享内存。这意味着操作系统允许多个进程访问内存中的共享段,就像它位于其地址空间中一样,方法是为每个请求映射该段。一个满足你所有要求的解决方案,也是跨平台的,是boost::interprocess。它是一个薄的便携式层,包装所有必要的操作系统调用。请参阅文档中的工作示例。
本质上,您的服务器进程只需要创建一个类型为boost::interprocess::shared_memory_object
的对象,为构造函数提供共享段的名称。调用其truncate()
方法时,操作系统将在此服务器进程的地址空间中查找足够大的隔离。从这一刻起,任何其他进程都可以创建相同类型的对象并提供相同的名称。现在,它也可以访问完全相同的内存。不涉及副本。
如果由于某种原因您无法使用可移植的 Boost库,或者由于其他原因想要将支持的平台限制为 Linux,请在mmap()
函数周围使用 POSIX API。这是 Linux 手册页。使用量基本上与上述Boost管道相差不远。使用shm_open()
创建命名段,并使用ftruncate()
截断。从那里开始,您可以通过调用mmap()
来接收指向此分配空间的映射指针。在更简单的情况下,您只会在父进程和子进程之间共享,您可以使用此网站上的此代码示例。
当然,无论您采用哪种方法,在使用共享资源时,请确保正确同步读/写以避免任何争用情况 - 就像在同一进程的多个线程的情况下所做的那样。
当然,只要矩阵在"正常"进程内存中,其他程序就无法访问矩阵。
不质疑设计方法:是的,您必须使用共享内存。查找函数,如 shmget((、shmat(( 等。然后,您不需要将指针传递给另一个程序(实际上这是行不通的(,您只需在任何地方使用ftok((中的相同文件即可访问共享内存。
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- C++两个源文件之间共享的枚举的静态实例
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- Directx 12 :在两个进程之间共享图形内存
- 如何在进程之间共享大量数据而不重复?(国际刑罚委员会)
- 简单使用 std::atomic 在两个线程之间共享数据
- C++:在另外两个对象之间共享一个对象
- 在C++中的程序之间共享指针
- 拥有或在对象之间共享资源
- 在两个结构之间共享数组
- 如何在不同的CMakeList.txt之间共享变量?
- 在QT中的两个窗口之间共享websocket连接
- 在VS2017中,我们如何在项目成员之间共享编译设置
- 通过require在不同的Lua状态之间共享全局变量
- 在两个类实例之间共享向量
- OpenGL GLFW GLAD 在项目之间共享 Visual C++.
- 如何在C++中的不同翻译单元之间共享枚举的实例
- 在 c++ 中,在线程之间共享数据容器的最佳方法是什么?
- 在Emscripten和Qt之间共享OpenGL代码