线程安全哈希表可通过互斥锁、读写锁或分段锁实现;低并发用mutex,读多写少用shared_mutex,高并发推荐分段锁以降低竞争,提升性能。

实现一个线程安全的哈希表,核心是在并发访问时保护数据不被破坏。C++中可以通过互斥锁(mutex)、读写锁(shared_mutex)或分段锁(striped locking)来控制对桶(bucket)的访问。为了提升性能,避免全局锁成为瓶颈,可以采用分段锁或读写锁机制。
最直接的方式是为整个哈希表加一把互斥锁。虽然实现简单,但在高并发下性能较差,因为所有操作都串行化。
#include <unordered_map>
#include <mutex>
template<typename K, typename V>
class ThreadSafeHashMap {
private:
std::unordered_map<K, V> map_;
mutable std::mutex mtx_;
public:
void put(const K& key, const V& value) {
std::lock_guard<std::mutex> lock(mtx_);
map_[key] = value;
}
V get(const K& key) const {
std::lock_guard<std::mutex> lock(mtx_);
auto it = map_.find(key);
return it != map_.end() ? it->second : V{};
}
bool remove(const K& key) {
std::lock_guard<std::mutex> lock(mtx_);
return map_.erase(key) > 0;
}
};
这个版本适合低并发场景。但当读多写少时,每次读操作也需独占锁,效率低下。
在读操作远多于写操作的场景下,使用 std::shared_mutex(C++17 起支持)能显著提升性能。读操作共享锁,写操作独占锁。
#include <unordered_map>
#include <shared_mutex>
template<typename K, typename V>
class ThreadSafeHashMapRW {
private:
std::unordered_map<K, V> map_;
mutable std::shared_mutex rw_mutex_;
public:
void put(const K& key, const V& value) {
std::unique_lock<std::shared_mutex> lock(rw_mutex_);
map_[key] = value;
}
V get(const K& key) const {
std::shared_lock<std::shared_mutex> lock(rw_mutex_);
auto it = map_.find(key);
return it != map_.end() ? it->second : V{};
}
bool remove(const K& key) {
std::unique_lock<std::shared_mutex> lock(rw_mutex_);
return map_.erase(key) > 0;
}
};
多个线程可同时进行 get 操作,只有 put 和 remove 会阻塞彼此和其他操作。适用于缓存、配置中心等读密集型应用。
进一步优化,可以将哈希表分成多个段(
segment),每段有自己的锁。这样不同段的操作可以并发执行,降低锁争用。
PictoGraphic
AI驱动的矢量插图库和插图生成平台
133
查看详情
常见做法是创建一个固定大小的锁数组,通过哈希值映射到某个锁。
#include <vector>
#include <unordered_map>
#include <mutex>
#include <shared_mutex>
#include <functional>
template<typename K, typename V, size_t N = 16>
class StripedHashMap {
private:
std::vector<std::unordered_map<K, V>> buckets_;
std::vector<std::shared_mutex> locks_;
size_t hash_to_segment(const K& key) const {
return std::hash<K>{}(key) % N;
}
public:
StripedHashMap() : buckets_(N), locks_(N) {}
void put(const K& key, const V& value) {
size_t seg = hash_to_segment(key);
std::unique_lock<std::shared_mutex> lock(locks_[seg]);
buckets_[seg][key] = value;
}
V get(const K& key) const {
size_t seg = hash_to_segment(key);
std::shared_lock<std::shared_mutex> lock(locks_[seg]);
auto it = buckets_[seg].find(key);
return it != buckets_[seg].end() ? it->second : V{};
}
bool remove(const K& key) {
size_t seg = hash_to_segment(key);
std::unique_lock<std::shared_mutex> lock(locks_[seg]);
return buckets_[seg].erase(key) > 0;
}
};
这种设计将锁的粒度从整个表缩小到每个桶,显著提升并发吞吐量。N 通常取 16 或 32,需根据实际并发量调整。
线程安全哈希表的实现应根据使用场景选择合适的同步策略:
注意异常安全和拷贝语义。get 返回值时若键不存在,应明确处理(抛异常或返回 optional)。更健壮的实现可返回 std::optional
基本上就这些。合理选择锁策略,能在保证线程安全的同时获得不错的性能表现。
以上就是C++怎么实现一个简单的线程安全哈希表_C++使用分段锁或读写锁优化并发性能的详细内容,更多请关注其它相关文章!
# 自己的
# 上海seo快照
# 广西网站建设咨询公司
# seo关键词设定原则
# 热点关键词搜索量排名
# 产品网站推广排名
# seo优化的意义
# 多网站优化关键字推广
# 吴川专业网站优化
# 面馆营销推广攻略
# 线上营销推广服务合约有哪些
# 是在
# c++
# 配置文件
# 解决方法
# 怎么做
# 重写
# 多写
# 多个
# 互斥
# 有什么
# red
# 并发访问
相关文章:
vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
Python实时数据流中的动态最值查找策略
在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
如何在J*a中使用Locale处理多语言环境
Mac终端命令大全_Mac常用Terminal指令速查
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置
React Router 嵌套组件中 URL 重定向问题的解决方案
j*a toString()的覆盖
钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧
C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用
126邮箱账号注册 电脑版登录入口
Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】
J*aScript打印功能_j*ascript输出控制
Lar*el Eloquent:高效统计带条件关联模型的数量
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
在VS Code中配置和运行Dart程序的完整步骤
快手官方唯一登录入口 谨防山寨钓鱼网站
如何将HTML表格多行数据保存到Google Sheet
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
谷歌邮箱注册显示错误Gmail服务器异常与延迟处理
AO3网页版最新入口合集 Archive of Our Own在线访问指南
taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】
顺丰国际快递查询 国际件官方查询入口
蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】
响应式图片在网页设计中的正确实现方法
TikTok网页版直接登录 TikTok网页端官方平台入口
Angular中单选按钮的正确使用与常见陷阱解析
抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩
快速CSGO开箱网站指南 CSGO开箱平台推荐
Win11怎么开启高性能模式_Windows 11电源计划优化设置
React Router v6 教程:构建认证保护的私有路由与重定向策略
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
必由学官方平台入口 必由学在线课堂登录地址
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
知音漫客官网漫画下载_知音漫客网页版阅读记录
处理Kafka消息时会话超时与实现幂等性消费者
微博网页版主页入口 微博官方网站免登录访问
msn官网入口地址手机版 msn官方网站手机最新链接
win11怎么清理更新缓存 Win11删除Windows Update下载文件释放空间【技巧】
12306怎么选座位选到安静区_12306选座安静区域选择策略
AO3网页版合集入口 Archive of Our Own同人作品浏览指南
铁路12306的积分有效期是多久_铁路12306积分有效期说明
*请认真填写需求信息,我们会在24小时内与您取得联系。