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

问题描述 投票:1回答:2

这与之前的帖子有关:

Allocating a large memory block in C++

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

我对C ++或OS了解不多,最好的方法是什么?我应该使用POSIX线程吗?矩阵是原始类型(doublefloat等),所有程序都知道它的尺寸。客户端程序需要整个矩阵,所以我不希望从服务器到客户端的mem拷贝延迟,我只是想直接共享该指针。我最好的选择是什么?

c++ shared-memory
2个回答
2
投票

您可以肯定用于共享直接访问矩阵M的进程间通信的一种机制是共享内存。这意味着操作系统允许多个进程访问内存中的共享段,就像它在其地址空间中一样,通过为每个请求映射它。满足您所有需求的解决方案,也是跨平台的解决方案是boost :: interprocess。它是一个薄的可移植层,包含所有必要的OS调用。请参阅正确的here in the docs工作示例。

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

如果由于某种原因您无法使用便携式Boost库,或者出于其他原因希望将支持的平台限制为Linux,请使用围绕mmap() function的POSIX API。这是Linux man page。用法基本上与上述Boost管道相差不远。使用shm_open()创建命名段并使用ftruncate()截断。从那里开始,您将通过调用mmap()来接收指向此分配空间的映射指针。在更简单的情况下,您只能在父进程和子进程之间共享,您可以使用this code example from this very website

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


0
投票

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

不要质疑设计方法:是的,你必须使用共享内存。查找函数如shmget(),shmat()等。然后你不需要将指针传递给另一个程序(实际上这不起作用),你只需在ftok()的所有地方使用相同的文件来访问共享内存。

© www.soinside.com 2019 - 2024. All rights reserved.