这与先前的帖子有关:
Allocating a large memory block in C++
我希望运行一个C ++服务器,该服务器生成一个巨大的矩阵M
。然后,在同一台计算机上,我想运行可以与该服务器联系的其他程序,并获取M
的内存地址。 M
是只读的,服务器会创建一次。我应该能够产生一个客户端./test
,并且该程序应该能够对M
进行只读访问。服务器应始终处于运行状态,但是我可以随时运行其他程序,例如./test
。
我对C ++或OS不太了解,最好的方法是什么?我应该使用POSIX线程吗?矩阵是原始类型(double
,float
等),所有程序都知道其尺寸。客户端程序需要整个矩阵,所以我不希望从服务器到客户端的mem复制产生延迟,我只想直接共享该指针。我最好的选择是什么?
答案 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()中到处使用相同文件即可访问共享内存。