为什么`std :: lock`不使用全局顺序锁定互斥体?

std::lockstd::scoped_lock可用于锁定一系列互斥锁,同时避免死锁。显然,他们使用由locktry_lockunlocks组成的某种算法来实现这一目标。

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

iCMS 回答:为什么`std :: lock`不使用全局顺序锁定互斥体?

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

如果使用了算法,那么如果对象中的代码使用std::lock来获取两个锁,而您的算法说要先获取用于保护对象的锁,那又会如何呢?它将陷入僵局。

,

该算法适用于任何可锁定的对象-其中一些可能是其他锁定的包装器(例如std::unique_lock),因此检查地址将是不够的。没有什么可以阻止该库认识到所涉及的所有类型都是标准库中的“原始”锁并应用您的建议。

本文链接:https://www.f2er.com/1860275.html

大家都在问