0

0

C++如何实现一个线程安全的哈希表_C++并发编程之分段锁技术应用

冰火之心

冰火之心

发布时间:2025-12-08 12:50:03

|

621人浏览过

|

来源于php中文网

原创

分段锁通过将哈希表划分为多个带独立锁的段,提升并发性能。基于std::unordered_map和std::mutex实现各段加锁,插入、查找、删除操作先定位段索引再加锁执行,减少竞争。段数通常设为CPU核心数2~4倍,可结合shared_mutex优化读多写少场景,避免哈希冲突集中以防锁热点。

c++如何实现一个线程安全的哈希表_c++并发编程之分段锁技术应用

在高并发场景下,哈希表作为高频使用的数据结构,必须保证多线程访问时的数据一致性与性能。C++标准库中的 std::unordered_map 并不提供内置的线程安全机制,因此需要我们自行设计线程安全版本。一种高效且实用的方法是使用“分段锁(Segmented Locking)”技术,它在性能和安全性之间取得了良好平衡。

什么是分段锁?

分段锁的核心思想是将整个哈希表划分为多个段(segment),每个段拥有独立的锁。当线程访问某个键时,通过哈希函数确定其所属的段,然后只对该段加锁。这样,不同段的操作可以并发执行,显著减少锁竞争。

相比对整个哈希表加一把互斥锁(全局锁),分段锁提高了并发度;相比为每个哈希桶加锁(细粒度锁),它又减少了内存开销和管理复杂度。

如何实现一个线程安全的分段哈希表?

我们可以基于 std::vector 存储多个哈希段,每个段是一个带锁的小型哈希表。以下是关键设计步骤:

立即学习C++免费学习笔记(深入)”;

1. 定义哈希段结构

每个段包含一个互斥锁和一个局部的 std::unordered_map

template 
class ConcurrentHashMap {
private:
    struct Segment {
        std::mutex mutex;
        std::unordered_map map;
    };
    
    std::vector segments;
    size_t segment_count;
    
    // 通过键的哈希值映射到具体段
    size_t get_segment_index(const K& key) const {
        std::hash hasher;
        return hasher(key) % segment_count;
    }
};
2. 线程安全的插入操作

插入时先计算段索引,获取对应段的锁,再执行写入:

Frase
Frase

Frase是一款出色的长篇 AI 写作工具,快速创建seo优化的内容。

下载
void put(const K& key, const V& value) {
    size_t index = get_segment_index(key);
    std::lock_guard lock(segments[index].mutex);
    segments[index].map[key] = value;
}
3. 线程安全的查找操作

查找同样定位到段,并在锁保护下读取:

bool get(const K& key, V& value) const {
    size_t index = get_segment_index(key);
    std::lock_guard lock(segments[index].mutex);
    auto it = segments[index].map.find(key);
    if (it != segments[index].map.end()) {
        value = it->second;
        return true;
    }
    return false;
}
4. 删除操作

删除也需加锁,避免与其他操作冲突:

bool remove(const K& key) {
    size_t index = get_segment_index(key);
    std::lock_guard lock(segments[index].mutex);
    return segments[index].map.erase(key) > 0;
}

性能优化建议

分段锁的性能受段数量影响较大,以下是一些实践建议:

  • 合理选择段数:通常设置为 CPU 核心数的 2~4 倍,例如 16 或 32 段。太少会增加锁争用,太多则带来额外内存和调度开销。
  • 使用 shared_mutex 支持读写分离:如果读远多于写,可将 std::mutex 替换为 std::shared_mutex,允许多个读操作并发执行。
  • 避免哈希冲突集中:确保键的哈希函数分布均匀,防止多个热点键落入同一段导致“锁热点”。

总结

分段锁是一种实用的并发控制策略,适用于中高并发下的哈希表实现。它通过降低锁粒度提升并发能力,同时避免了全细粒度锁的复杂性。结合 C++ 的 RAII 和标准容器,可以简洁高效地构建线程安全的哈希表。在实际项目中,可根据负载特征调整段数或引入更高级的无锁技巧进一步优化。

基本上就这些。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

535

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

21

2026.01.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

98

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

84

2025.11.13

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

25

2025.12.30

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

13

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号