在共享内存中分配对象
Allocate object in shared memory
这可能是一个愚蠢的问题,但。。。我有两个进程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。
因此,不能将指针从一个进程传递到另一个进程。但是,您可以传递共享内存名称。
相关文章:
- 使用操作重载对象重新分配对象
- 静态分配对象的值初始化
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 堆分配对象中的堆栈对象在 c++ 中在哪里分配?
- 在 c++ 的构造函数中分配对象向量时出错
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 操作后通过运算符分配对象
- 如何捕获源自静态分配对象的构造函数的异常?
- 在C++中,当重新分配对象时,为什么构造函数在析构函数之前触发?
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 将动态分配对象传递到 boost::any 构造函数中
- 混合指向已分配对象和作用域对象的指针
- C 删除指向动态分配对象的指针
- 有关动态分配对象的问题
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- C++ 中的黑白堆分配对象和堆栈分配对象的性能差异
- 是隐式创建的默认构造函数,负责分配对象内存
- 如何删除用于动态分配对象的智能指针
- 分配对象数组时如何初始化每个对象
- 用于堆栈分配对象的C++虚拟析构函数内联