You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在只读打开的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:36:03