C++中的mutex、condition_val

在 C++ 中,锁分为两类:互斥量(Mutex,即锁本身)锁管理类(Lock Managers,即 RAII 包装器)

A. 锁本身 (std::mutex 家族)

这些是真正的锁对象,位于 <mutex> 头文件。

  1. std::mutex**(最常用)**
    • 特点:独占互斥锁。一个线程拿到了,其他线程就得等。
    • 方法lock()(上锁,失败则阻塞)、unlock()(解锁)、try_lock()(尝试上锁,失败返回 false,不阻塞)。
    • 注意:不可递归上锁(同一个线程不能连续 lock 两次,否则死锁)。
  1. std::recursive_mutex**(递归锁)**
    • 特点 :允许同一个线程多次上锁。
    • 场景:比如一个递归函数,每一层都需要加锁;或者函数 A 调函数 B,A 和 B 都要加同一把锁。
    • 代价:比普通 mutex 慢,尽量少用。
  1. std::timed_mutex**(超时锁)**
    • 特点:在拿不到锁时,可以设置等待时间,而不是无限死等。
    • 方法try_lock_for(std::chrono::milliseconds(100))
  1. std::shared_mutex**(读写锁,C++17 引入)**
    • 特点:解决"读多写少"的性能问题。
    • 机制
      • 共享锁 (Shared Lock):多个线程可以同时加这个锁(只读操作)。
      • 独占锁 (Exclusive Lock):只有一个线程能加这个锁(写操作),且此时不能有其他人读。
B. 锁管理类 (RAII Wrappers) ------ 这才是你该用的东西

切记: 尽量不要手动调用 mutex.lock()unlock()。一旦中间抛出异常,或者你忘记 unlock,程序就死锁了。

使用以下类来自动管理锁的生命周期:

  1. std::lock_guardstd::mutex****(轻量级,简单粗暴)
    • 机制 :构造时立马 lock,析构时立马 unlock
    • 缺点:中途不能手动解锁,必须等到作用域结束。
    • 场景:简单的临界区保护。
  1. std::unique_lockstd::mutex****(灵活,功能全)
    • 机制 :构造时 lock(也可以选择不立马 lock),析构时 unlock
    • 优点
      • 可以中途手动 unlock()(比如为了让出 CPU 一会儿)。
      • 配合条件变量 ( std::condition_variable**) 必须用它**。
      • 支持"延迟锁定"(defer_lock)。
    • 代价:比 lock_guard 稍微重一点点。

代码示例:unique_lock 的灵活性

复制代码
std::mutex mtx;

void complex_task() {
    // 1. 构造时加锁
    std::unique_lock<std::mutex> lock(mtx);
    
    // 操作共享数据...
    
    // 2. 中途临时解锁(比如要做一些耗时的、不涉及共享数据的操作)
    lock.unlock(); 
    // ... 做耗时操作 ...
    
    // 3. 重新加锁
    lock.lock();
    
    // 4. 函数结束,自动解锁
}

相关推荐
JAVA面经实录9177 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
William Dawson7 小时前
2026软考中级系统集成项目管理工程师备考笔记
笔记·系统集成项目管理工程师
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮8 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
小程故事多_809 小时前
[大模型面试系列] 多轮对话 Agent 设计实战(含窗口优化 + 工具调用精髓)
人工智能·面试·职场和发展
样例过了就是过了10 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
谭欣辰10 小时前
C++ 排列组合完整指南
开发语言·c++·算法
love530love10 小时前
精简版|Claude-HUD 插件介绍 + 一键安装教程
人工智能·windows·笔记
想成为优秀工程师的爸爸11 小时前
第三十篇技术笔记:郭大侠学UDS - 人有生老三千疾,望闻问切良方医
网络·笔记·网络协议·tcp/ip·信息与通信
橙子也要努力变强11 小时前
信号捕捉底层机制-机理篇2
linux·服务器·c++