最近需要用到进程间共享内存,同时将容器放入共享内存中方便操作,摸索如下
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <iostream>
#include <string>
using namespace boost::interprocess;
using std::cout;
using std::endl;
using std::to_string;
typedef managed_shared_memory::segment_manager segment_manager_t;
typedef allocator<void, segment_manager_t> void_allocator;
typedef allocator<char, segment_manager_t> char_allocator;
typedef basic_string<char, std::char_traits<char>, char_allocator> char_string;
typedef std::pair<const char_string, char_string> string_string_value_type;
typedef allocator<string_string_value_type, segment_manager_t> string_string_map_allocator;
typedef map<char_string, char_string, std::less<char_string>, string_string_map_allocator> string_string_map;
const unsigned long long g_size = 40LL * 1024 * 1024 * 1024;
int main()
{
shared_memory_object::remove("MySharedMemory");
managed_shared_memory segment(open_or_create, "MySharedMemory", g_size);
void_allocator alloc_inst(segment.get_segment_manager());
string_string_map* table_map = segment.construct<string_string_map>("table_map")(std::less<char_string>(), alloc_inst);
//构建自定义string
char_string key_key_string("tag", alloc_inst);
char_string key_string("fvalue", alloc_inst);
char_string value_string("tag_fvalue", alloc_inst);
string_string_value_type ss_map_value(key_string, value_string);
char data[512]{"电信"};
table_map->insert(ss_map_value);
for (int i = 0; i < 1000000; ++i)
{
std::string ip = "192.168.0.";
table_map->emplace(char_string(ip.append(to_string(i)).c_str(), alloc_inst), char_string(data, alloc_inst));
}
/* ---读取共享内存,并解析map--- */
managed_shared_memory segment1(open_or_create, "MySharedMemory", g_size);
string_string_map* table_map2 = segment1.find<string_string_map>("table_map").first;
cout << table_map2->size() << " " << table_map2->max_size() << endl;
//创建对应迭代器
char_string key_name2("fvalue", segment1.get_segment_manager());
//从map中遍历数据,与stl的map一致
for (auto i = table_map2->begin(); i != table_map2->end(); ++i)
{
cout << i->first << " " << i->second << endl;
}
shared_memory_object::remove("MySharedMemory");
return 0;
}
编译时需要链接rt、pthread库