如何在只读打开的Boost::managed_shared_memory段中查找interprocess::unordered_map元素
问题根因
你构造char_string时触发访问违规的核心原因是:
- 你以
open_read_only模式打开共享内存段,段的权限不允许任何写入操作 - 你传入的
CharAllocator绑定到该只读共享段,当构造的字符串长度超过boost::basic_string的小字符串优化阈值时,分配器会尝试向只读共享段申请内存,直接触发权限不足的访问错误。
最优解决方案:启用unordered_map异构查找
Boost.UnorderedMap 支持透明哈希与透明相等比较,开启后不需要构造共享内存分配的char_string,直接传入普通std::string、const char*等字符串类型即可调用find()、at()方法。
第一步:修改Map类型定义
替换原有哈希、比较器为透明实现:
// 新增透明哈希实现 struct TransparentHash { using is_transparent = void; template <typename StrT> std::size_t operator()(const StrT& str) const { return boost::hash_range(str.begin(), str.end()); } }; // 新增透明相等比较实现 struct TransparentEqual { using is_transparent = void; template <typename StrT1, typename StrT2> bool operator()(const StrT1& a, const StrT2& b) const { return a == b; } }; // 原有其他typedef保持不变,仅修改MyShmMap的定义 typedef boost::unordered_map<KeyType, MappedType, TransparentHash, TransparentEqual, ShmemAllocator> MyShmMap;
第二步:直接调用查找接口
无需再构造char_string,直接传入普通字符串参数即可:
managed_shared_memory segment(open_read_only, "segment_name"); MyShmMap* mymap = segment.find<MyShmMap>("segment_name").first; // 直接传std::string或者const char*即可,不需要构造char_string std::string searchKey = "your_key"; MyShmMap::iterator it = mymap->find(searchKey); if (it != mymap->end()) { auto value = it->second; // 后续业务逻辑 }
注:该特性要求Boost版本 >= 1.62,当前主流发行版的Boost库均已支持。
备选方案(不推荐)
如果你无法修改Map的原有定义,可直接手动遍历所有元素比对key,你已经验证遍历逻辑可正常运行,仅在数据量较大时查询效率会明显低于哈希查找。
内容的提问来源于stack exchange,提问作者minerne
相关产品推荐
相关产品推荐

