锁定多个互斥锁(Locking multiple mutexes)

2019-08-03 00:38发布

我不知道是否有可能在同一时间锁定多个互斥锁,如:

 Mutex1.Lock();
 {
     Mutex2.Lock();
     {
          // Code locked by mutex 1 and 2.
     }
     Mutex2.Unlock();

     // Code locked by mutex 1.
 }
 Mutex1.Unlock();

这将是某些情况下非常有用的。 谢谢。

Answer 1:

这是可能的,但在整个应用程序,否则僵局是一个可能的结果(如果两个线程收购则相反的顺序每一个线程可以等待对方释放锁一个锁)锁定的顺序必须是一致的。

推荐使用范围的锁定和解锁的异常安全设施,确保锁总是发布( std::lock_guardstd::mutex为例):

std::mutex mtx1;
std::mutex mtx2;

std::lock_guard<std::mutex> mtx1_lock(mtx1);
{
    std::lock_guard<std::mutex> mtx2_lock(mtx2);
    {
    }
}

如果你的编译器不支持这些C ++ 11的功能提升具有类似boost::mutex ,并boost::lock_guard



Answer 2:

std::lock似乎为此而存在。

锁可锁定对象锁1,锁2,...,使用曝光锁N死锁避免算法,以避免死锁。 目的是通过一个未指定的一系列调用锁,try_lock,开锁的锁定。 如果调用一个异常锁定或解锁结果,解开被要求重新抛出之前的任何锁定的对象。

http://en.cppreference.com/w/cpp/thread/lock



Answer 3:

C ++ 17还提供scoped_lock用于锁定多个互斥的特定目的,其防止死锁在RAII风格,类似于lock_guard

#include<mutex>

std::mutex mtx1, mtx2;
void foo()
{
    std::scoped_lock lck{mtx1, mtx2};
    // proceed
}


文章来源: Locking multiple mutexes