c++中用boost实现共享内存创建map容器

时间:2022-07-04 09:04:28
#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> using namespace boost::interprocess; using std::cout; using std::endl; //类型和allocator的定义,使用共享内存时需要使用boost::interprocess中 //重新实现的容器而不能使用标准容器 typedef managed_shared_memory::segment_manager segment_manager_t; typedef allocator<void, segment_manager_t> void_allocator; /*-- 自定义string数据类型 --*/ typedef allocator<char, segment_manager_t> char_allocator; typedef basic_string<char, std::char_traits<char>, char_allocator> char_string; /*-- 自定义map<string, 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; /*-- 自定义map<string, map<string, string>> --*/ typedef std::pair<const char_string, string_string_map> string_string_string_value_type; typedef allocator<string_string_string_value_type, segment_manager_t> string_string_string_map_allocator; typedef map<char_string, string_string_map, std::less<char_string>, string_string_string_map_allocator> string_string_string_map; int main() { /* ---创建共享内存,并创建map--- */ //移除共享内存 shared_memory_object::remove("MySharedMemory"); //创建共享内存,并指定名称和大小 managed_shared_memory segment(open_or_create, "MySharedMemory", 102400); void_allocator alloc_inst(segment.get_segment_manager()); //在共享内存上构建string_string_string_map,并返回指针 string_string_string_map *table_map = segment.construct<string_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); //构建自定义map<string, string>的键值对,不能够使用std::string string_string_value_type ss_map_value(key_string, value_string); //在共享内存上构建string_string_map并返回指针 string_string_map *col_map = segment.construct<string_string_map> ("tag_fvalue")(std::less<char_string>(), alloc_inst); col_map->insert(ss_map_value); //构建自定义map<string, map<string, string>>的键值对 string_string_string_value_type sss_map_value(key_key_string, *col_map); table_map->insert(sss_map_value); /* ---读取共享内存,并解析map--- */ managed_shared_memory segment1(open_or_create, "MySharedMemory", 102400); string_string_string_map *table_map2 = segment1.find<string_string_string_map>("table_map").first; //创建对应迭代器 string_string_string_map::iterator sss_ite; string_string_map::iterator ss_ite; char_string key_name1("tag", alloc_inst); char_string key_name2("fvalue", alloc_inst); //从map中遍历数据,与stl的map一致 sss_ite = table_map2->find(key_name1); if (sss_ite != table_map2->end()) { cout << sss_ite->first << endl; ss_ite = sss_ite->second.find(key_name2); cout << ss_ite->second << endl; } return 0; }