std::lock函数与死锁避免
请说明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管理锁生命周期。