std::shared_mutex、std::mutex和std::recursive_mutex是什么锁

std::shared_mutex。std::mutex和std::recursive_mutex是什么锁

锁类型 类型 核心特性 适用场景
std::shared_mutex 读写锁 读共享、写独占 读多写少
std::mutex 普通互斥锁 完全独占,不可递归 通用场景(90%的情况)
std::recursive_mutex 递归互斥锁 同一线程可重复加锁 递归函数、嵌套调用

详细对比

1. std::shared_mutex ------ 读写锁(C++17)
特性 说明
读模式 多个线程可同时持有共享锁,并发读取
写模式 只有一个线程可持有独占锁,写时禁止任何读
适用场景 读多写少(如配置缓存、路由表、DNS缓存)
性能 读并发高,但写操作开销比 mutex
RAII工具 std::shared_lock(读)、std::unique_lock(写)
cpp 复制代码
std::shared_mutex rw_mutex;
std::map<int, int> cache;

// 读操作:多个线程可并发
int read(int key) {
    std::shared_lock lock(rw_mutex);  // 共享锁
    return cache[key];
}

// 写操作:独占
void write(int key, int val) {
    std::unique_lock lock(rw_mutex);  // 独占锁
    cache[key] = val;
}
2. std::mutex ------ 普通互斥锁(C++11)
特性 说明
独占性 完全独占,同一时间只有一个线程能持有
递归 不支持,同一线程重复 lock() 会导致死锁
适用场景 90%的常规多线程场景
性能 最基础、性能最高
RAII工具 std::lock_guardstd::unique_lock
cpp 复制代码
std::mutex mtx;
int counter = 0;

void increment() {
    std::lock_guard lock(mtx);  // 自动加锁解锁
    ++counter;
}
3. std::recursive_mutex ------ 递归互斥锁(C++11)
特性 说明
独占性 独占,但同一线程可重复加锁
递归 支持,内部维护计数器,加锁几次就要解锁几次
适用场景 递归函数、嵌套调用中需要加锁的场景
性能 mutex 略低(需维护线程ID和计数)
注意 容易掩盖设计缺陷,能不用就不用
cpp 复制代码
std::recursive_mutex rec_mtx;

void funcA() {
    std::lock_guard lock(rec_mtx);  // 第一次加锁
    funcB();                        // 内部再次加锁,不会死锁
}

void funcB() {
    std::lock_guard lock(rec_mtx);  // 第二次加锁(同一线程)
}

对比总结

维度 std::mutex std::recursive_mutex std::shared_mutex
C++版本 C++11 C++11 C++17
独占性 ✅ 独占 ✅ 独占 ✅ 写独占,❌ 读共享
递归 ❌ 不支持 ✅ 支持 ❌ 不支持
读并发 ❌ 不支持 ❌ 不支持 ✅ 支持
性能 最高 略低 读场景高,写场景低
RAII工具 lock_guard / unique_lock lock_guard / unique_lock shared_lock(读) / unique_lock(写)
适用场景 通用 递归/嵌套调用 读多写少

选择建议

  1. 默认首选std::mutex + std::lock_guard
  2. 读多写少std::shared_mutex + std::shared_lock(读)/ std::unique_lock(写)
  3. 递归调用std::recursive_mutex(但优先考虑重构代码避免递归加锁)
相关推荐
91刘仁德3 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
码行山野赴时序归途3 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
景熙55233 小时前
单体项目编写思路和落地形式
java·开发语言
库玛西4 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
别动我齐刘海4 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人
zhangfeng11334 小时前
《从“人工适配“到“智能生成“:KernelSwift 跨国产芯片算子迁移全栈方案解读》 —— 强调范式跃迁和跨硬件属性,适合偏架构分析的写法
人工智能·算法·华为·ai编程·npu
0+1114 小时前
算法 --滑动窗口
c++·算法·leetcode
计算机毕设定制辅导-无忧学长4 小时前
《基于SpringBoot的未成年人健康知识科普平台的设计与实现》
java·开发语言·vue.js·spring boot·未成年人健康知识科普平台
stolentime4 小时前
(有原题)CSP-S2026第一轮试题(附答案解析、markdown源码)
c++·csp
Ivanqhz4 小时前
Ping-Pong 双缓冲
开发语言·人工智能·python·深度学习·mlir