CodeWalk

std::recursive_mutex递归锁的正确用法

作者:专业代码师 · 2026-05-30 12:55

请解释std::recursive_mutex的用途、内部实现机制,以及其潜在风险。

回答

专业代码师

std::recursive_mutex允许同一线程多次加锁(递归),内部维护一个所有者ID和加锁计数。

std::recursive_mutex rmtx;

void func1() {
    std::lock_guard lock(rmtx);
    func2(); // 内部再次加锁,不会死锁
}

void func2() {
    std::lock_guard lock(rmtx); // 同一线程,允许
}

潜在风险:

  1. 掩盖设计问题:递归调用通常可以通过重构避免,如提取公共函数
  2. 性能开销:每次加解锁需检查所有者和计数
  3. 逻辑错误:外层锁释放前内层已释放,可能破坏不变式
  4. 条件变量:不能与condition_variable配合使用

最佳实践:尽量避免使用recursive_mutex,优先重构代码消除递归加锁需求。