确定我们现在有std::mutex
,std::unique_lock
,std::shared_lock
。但是,我想知道是否有任何一种方法可以同时锁定多个互斥体(通过说同一时间,我的意思是锁定的动作是事务,不会被中断)。
我有此要求的原因是:
假设我们有几个互斥体mtx1
,mtx2
。另外,存在两个线程:
void th1() {
std::unique_lock lck1(mtx1);
std::unique_lock lck2(mtx2);
// whatever
}
void th2() {
std::unique_lock lck2(mtx2);
std::unique_lock lck1(mtx1);
// whatever
}
然后,很明显这里存在死锁危险。您可能会说这里存在设计错误,因为mtx1
和mtx2
应该合并为一个互斥体。当然,在这种情况下是正确的。但是在许多情况下,原子地锁定多个互斥锁可能会使代码变得简单。