我想知道是否可以同时锁定多个互斥锁,例如:
Mutex1.Lock();
{
Mutex2.Lock();
{
// Code locked by mutex 1 and 2.
}
Mutex2.Unlock();
// Code locked by mutex 1.
}
Mutex1.Unlock();
这在某些情况下会非常有用。谢谢。
我想知道是否可以同时锁定多个互斥锁,例如:
Mutex1.Lock();
{
Mutex2.Lock();
{
// Code locked by mutex 1 and 2.
}
Mutex2.Unlock();
// Code locked by mutex 1.
}
Mutex1.Unlock();
这在某些情况下会非常有用。谢谢。
std::lock
似乎为此目的而存在。
使用死锁避免算法锁定给定的可锁定对象 lock1, lock2, ..., lockn 以避免死锁。对象被一系列未指定的 lock、try_lock、unlock 调用锁定。如果调用 lock 或 unlock 导致异常,则在重新抛出之前为任何锁定的对象调用 unlock。
C++17 还提供scoped_lock
了锁定多个互斥锁的特定目的,以防止 RAII 样式中的死锁,类似于lock_guard
.
#include<mutex>
std::mutex mtx1, mtx2;
void foo()
{
std::scoped_lock lck{mtx1, mtx2};
// proceed
}
这是可能的,但锁定的顺序必须在整个应用程序中保持一致,否则可能会导致死锁(如果两个线程以相反的顺序获取锁,则每个线程可能正在等待另一个线程释放其中一个锁)。
建议使用范围锁定和解锁工具来确保异常安全,以确保始终释放锁定(std::lock_guard
例如std::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 在boost::mutex
和boost::lock_guard
.