多std::lock_guard能否保证锁顺序?为何需配合std::lock使用?
关于std::lock与死锁的疑问及解答
先看cppreference.com上std::lock的示例代码:
// use std::lock to acquire two locks without worrying about // other calls to assign_lunch_partner deadlocking us { std::lock(e1.m, e2.m); std::lock_guard<std::mutex> lk1(e1.m, std::adopt_lock); std::lock_guard<std::mutex> lk2(e2.m, std::adopt_lock); }
原问题
- 我认为不同线程间保持一致的锁顺序(先锁lk1再锁lk2)即可避免死锁,为何还需要使用std::lock?(我也查阅过相关问题,但仍不确定为何仅用多个std::lock_guard按相同顺序锁仍不够)
- 这是否与std::lock_guard支持RAII风格有关?
问题解决(编辑补充)
- 若代码中所有lk1和lk2的声明顺序完全一致(即所有地方都先锁e1.m再锁e2.m),则无需使用std::lock。
- 因此,std::lock相当于一种安全保障,防止代码中其他地方出现先声明lk2再声明lk1(即先锁e2.m再锁e1.m)的情况(实际开发中这种保障很重要,因为难免出错)。
感谢所有评论者,若有错误请指出。
内容的提问来源于stack exchange,提问作者starriet 차주녕
相关产品推荐
相关产品推荐

