项目有个需求,希望程序异常重启后能尽快恢复数据,并且尽量避免数据丢失
比较主流的方式如redis
、mysql
一样写日志,重启后从日志中恢复
想到共享内存在程序崩溃时可以不被回收,如果把数据全部存到共享内存那程序重启后可以直接读取,岂不美哉
项目主要使用map存放大量的C++类对象,会占用10G+的内存空间
数据要想放到共享内存,需要map及所有的对象都要在共享内存中生成,
学习了 boost 共享内存 managed_shared_memory
发现, 需要重定义string
, map
等对象的allocator
,将对象的堆放到共享内存上, 已string对象为例
标准库版
std::string = basic_string<char, char_traits<char>, allocator<char>>;
共享内存版
typedef boost::interprocess::allocator<char, boost::interprocess::managed_shared_memory::segment_manager> CharAllocator;
typedef boost::interprocess::basic_string<char, std::char_traits<char>, CharAllocator> string;
数据类型太多,工作量巨大,还会造成类型不兼容,溜了溜了
- 参考文档:
托管共享内存
基于boost的共享内存系列-map