使用Boost将stl map放入共享内存

 最近需要用到进程间共享内存,同时将容器放入共享内存中方便操作,摸索如下

#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库 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值