首页 > 解决方案 > 为什么 `std::lock` 不使用全局排序锁定互斥锁?

问题描述

std::lock并且std::scoped_lock可用于锁定一系列互斥锁,同时避免死锁。显然,他们使用了一些由locks、try_locks 和s 组成的算法unlocks来实现这一点。

std::lock因为它应该更简单,所以不能std::scoped_lock使用某种全局排序(例如它们的地址用&)锁定互斥锁,因为当互斥锁总是以相同的顺序锁定时不会发生死锁?

标签: c++lockingmutex

解决方案


这可能会与其他算法陷入僵局。假设一个锁保护对象的集合,而另一个锁保护该集合中的单个对象。不调用的代码std::lock将首先锁定集合,然后找到对象,然后想要获取保护该特定对象的锁。

如果使用了您的算法,那么如果对象中的代码std::lock用于获取两个锁并且您的算法说在保护集合的锁之前获取保护对象的锁,会发生什么?它会陷入僵局。


推荐阅读