CodeWalk

std::lock函数与死锁避免

作者:我还是少年 · 2026-05-30 12:55

请说明std::lock()函数如何帮助避免死锁,并给出使用示例。

回答

我还是少年

std::lock()接受多个可锁定对象(Lockable),使用内部死锁避免算法(如按地址排序或回退策略)一次性锁定所有对象。

std::mutex m1, m2;
// 错误方式(可能死锁)
// std::lock_guard lock1(m1);
// std::lock_guard lock2(m2); // 顺序不一致导致死锁

// 安全方式
{
    std::lock(m1, m2); // 原子锁定
    std::lock_guard lock1(m1, std::adopt_lock);
    std::lock_guard lock2(m2, std::adopt_lock);
    // 临界区
}

std::lock保证要么全部锁定成功,要么已锁定的全部解锁回滚。配合adopt_lock使用RAII管理锁生命周期。