在共享内存中分配对象

Allocate object in shared memory

本文关键字:分配 对象 内存 共享      更新时间:2023-10-16

这可能是一个愚蠢的问题,但。。。我有两个进程P1和P2。P1是否可以在共享内存中轻松地分配一个对象O,这对于P2来说是可见的?(P1使用管道将指向O的指针传递给P2)。类似于:

// P1
ptr1 = new SharedMemoryObject(); // object O
pipe.send(ptr1)
// P2
ptr = pipe.recieve()
// I have access to O now

我想避免序列化和管道化对象,我想在共享内存中创建它们,并传递指针

每个进程都有自己的地址空间,这意味着尽管两个进程之间可以共享一个物理内存地址,但这可能对应于每个进程地址空间中的不同地址。这意味着,在设计将存在于共享内存中的对象时,必须确保它们使用偏移量或索引,而不是纯指针。

共享内存会产生同步问题,这可能会导致无尽的问题,所以除非你真的必须这样做,否则我建议你优先使用管道路由而不是共享内存。

否。从P1到P2的指针是没有意义的。

不过,您可能想了解一下"基于指针",它更适合于进程间通信。

副作用是,任何在内部使用普通指针(而不是基于指针)的类都不能以这种方式共享。

这个答案专门针对linux

您可以使用shm_open函数创建或打开共享内存文件,该文件可以是mmap()-ed。正如你可以从mmap:的手册页中看到的那样

对象所在的实际位置映射由mmap()返回

成功后,mmap()返回一个指针到映射区域。出现错误时值MAP_FAILED(即(void*)-1) 返回,并适当设置errno。

因此,不能将指针从一个进程传递到另一个进程。但是,您可以传递共享内存名称。