std::recursive_mutex递归锁的正确用法
请解释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); // 同一线程,允许
}
潜在风险:
- 掩盖设计问题:递归调用通常可以通过重构避免,如提取公共函数
- 性能开销:每次加解锁需检查所有者和计数
- 逻辑错误:外层锁释放前内层已释放,可能破坏不变式
- 条件变量:不能与
condition_variable配合使用
最佳实践:尽量避免使用recursive_mutex,优先重构代码消除递归加锁需求。