使用类内的类提升进程间共享内存

Posted

技术标签:

【中文标题】使用类内的类提升进程间共享内存【英文标题】:boost interprocess shared memory with class inside class 【发布时间】:2014-07-24 17:07:47 【问题描述】:

我需要在共享内存中创建一个结构。这是类的一个示例:

struct A
 std::string str1;
 int val;

struct B
  A inner;
  std::string name;

我在网上找不到这样的例子,但经过一番搜索后,我发现我可能需要实现一些分配器,并且字符串之类的类型不应该被用作裸露的, 所以我为字符串创建了一个分配器,如下所示:

typedef allocator<char, ip::managed_shared_memory::segment_manager> char_alloc 
class String2: public ip::basic_string<char, std::char_traits<char>, char_alloc >  public:     
    String2(char_alloc& _all): ip::basic_string<char, std::char_traits<char>,  char_alloc >(_all) ; ;

但是现在我在试图理解如何创建一个对两个类都像这样工作的分配器时遇到了一些问题。

有人有类似的例子吗?

提前致谢

【问题讨论】:

【参考方案1】:

您应该尝试使用 char 而不是 std::string。

struct A
 char str1[64];
 int val;
;

struct B
 A inner;
 char name[64];
;

【讨论】:

【参考方案2】:

安置新的可能会有所帮助。假设您有一个指向通过某种未知方式创建的共享内存的指针:

void* some_shared_mem; // initialized somehow
B* shared_B = new (some_shared_mem) B; // call the B constructor.
share_B->A.val = 5;

但是,您不应该将任何东西放入分配指针的共享内存中。即使您保证这些指针引用回共享内存,您也不能确定每个共享内存的进程都在同一地址看到共享内存。 some_shared_mem 在程序中可能是 0x10000,在其他程序中可能是 0x20000。因此,即使共享指针是在共享内存之外分配的(例如 0x10010),映射为 0x20000 的程序也会将该点视为 0x10010,从它的角度来看,它不在共享内存内。

因此,只要您映射到共享内存的各种结构中没有引用或指针,您就可以做您尝试做的事情。

【讨论】:

【参考方案3】:

这个答案来得有点晚,但为了将来参考,Interprocess 库中的 "Containers of containers" 部分有这个确切的用例。

【讨论】:

以上是关于使用类内的类提升进程间共享内存的主要内容,如果未能解决你的问题,请参考以下文章

提升进程间共享内存删除对象而不破坏

在没有共享内存的情况下提升进程间字符串

进程间通信---共享内存

java类内多个函数如何同步

提升进程间和 valgrind

Linux进程间通信—使用共享内存