通过类内部的类提升进程间共享内存

boost interprocess shared memory with class inside class

本文关键字:进程 共享 内存 内部      更新时间:2023-10-16

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

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) {;} };

但是现在我有一些问题试图理解我如何创建一个分配器,像这样为两个类工作。

有人有类似的例子吗?

Thanks in advance

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

struct A{
 char str1[64];
 int val;
};
struct B{
 A inner;
 char name[64];
};

新的位置可能会有所帮助。假设您有一个指向共享内存的指针,其创建方式未知:

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,从它的角度来看,这个点不在共享内存中。

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

这个答案来得有点晚,但是为了将来参考,Interprocess库中的"容器的容器"一节有这个确切的用例。