std::lock
和std::scoped_lock
可用于锁定一系列互斥锁,同时避免死锁。显然,他们使用由lock
,try_lock
和unlocks
组成的某种算法来实现这一目标。
应该更简单,std::lock
和std::scoped_lock
不能像死锁那样使用某种全局顺序(例如,它们的地址用&
来锁定互斥锁)总是以相同的顺序锁定互斥锁时不会发生?
std::lock
和std::scoped_lock
可用于锁定一系列互斥锁,同时避免死锁。显然,他们使用由lock
,try_lock
和unlocks
组成的某种算法来实现这一目标。
应该更简单,std::lock
和std::scoped_lock
不能像死锁那样使用某种全局顺序(例如,它们的地址用&
来锁定互斥锁)总是以相同的顺序锁定互斥锁时不会发生?
这可能会与其他算法陷入僵局。假设一个锁保护一个对象集合,而另一个锁保护该集合中的单个对象。不调用std::lock
的代码将首先锁定该集合,然后找到该对象,然后想要获取保护该特定对象的锁。
如果使用了算法,那么如果对象中的代码使用std::lock
来获取两个锁,而您的算法说要先获取用于保护对象的锁,那又会如何呢?它将陷入僵局。
该算法适用于任何可锁定的对象-其中一些可能是其他锁定的包装器(例如std::unique_lock
),因此检查地址将是不够的。没有什么可以阻止该库认识到所涉及的所有类型都是标准库中的“原始”锁并应用您的建议。