该怎样将类内成员存储进共享内存呢?

我想将一个类内 private 元素 map 存储进共享内存好让多个进程都能访问到它, 但并不想将整个类都存储进去, 请问该如何实现呢?
关注者
34
被浏览
13,541

7 个回答

Boost.Interprocess。成熟的,现成的,专门做你要的多进程共享数据结构这事的。

你可以用它提供的allocator来让STL容器可以在共享内存上分配内存空间,然后用它提供的同步原语来做进程间同步。

将容器放入共享内存,并允许多进程访问是完全可能的。共享内存是最快的进程间通讯方式,但要注意数据竞争问题。

我曾经在项目中实现了一套共享内存专用的容器以及通讯方法,同时还可以实现进程间调用(多参数,返回值,栈结构)。

你的需求的核心在于如何在共享内存里分配内存。共享内存是大段连续内存,而 C++ 容器每次可能只需要分配若干个字节;所以你需要实现一个内存分配器(注意对齐问题)。另外值得注意的是,不同版本的编译器所附带的 C++ 容器很可能不具备二进制兼容性(甚至 debug 和 release 版本都不一样),所以要么保证一致,要么实现一套二进制兼容的容器。最后,你需要使用核心对象(互斥器,信号量等)来保证访问的数据是正确的。

如果觉得这些太麻烦,也可以使用或参考 boost 的 interprocess 和 share memory 库,基本上有你需要的所有东西,可以将容器放入共享内存。不过我没有在实际项目中应用过这些库,所以易用性还有性能方面并不清楚。


更新: @望山 提到的指针问题如果没有考虑到的确不可以,所以我自己实现的共享内存容器还有 boost.interprocess 对指针都进行了封装。请注意这一点。具体可以看这里:

由于许多 STL 容器的实现使用了原始指针,而不是内存分配器里定义的指针类型,所以这些 STL 容器是无法放在共享内存里面的。也因此,boost 同样实现了自己版本的容器。