在很多地方都有建议使用std :: defer_lock:
{
std::unique_lock<std::mutex> lk1(mutex1, std::defer_lock);
std::unique_lock<std::mutex> lk2(mutex2, std::defer_lock);
std::lock(lk1, lk2);
//Do some stuff
}
但是,如果我不使用std :: defer_lock,并尝试简单地做:
{
std::unique_lock<std::mutex> lk1(mutex1);
std::unique_lock<std::mutex> lk2(mutex2);
//Do some stuff
}
据我所知,此代码将锁定mutex1,然后锁定mutex2。解锁将以相反的顺序执行 - mutex2,然后是mutex1。没有理由陷入僵局。
文档说,std :: lock(lk1,lk2);在第一个例子中将同时锁定buth互斥锁。那么,这是某种优化吗?
答案 0 :(得分:0)
死锁问题是锁定多个互斥锁的顺序问题。这在简单的应用程序中可能是显而易见的,但在更多(或太多)复杂的情况下非常困难,其中互斥体可能并不总是被锁定在同一个函数上,并且它们通常不被称为lk1,lk2,...因此通过同时锁定,你不会创建两个线程在锁定的互斥锁上等待的情况,因此无法解锁它们锁定的互斥锁。
您可能希望避免混用互斥锁,但这可能会导致其他棘手的情况。但是,如果可能的话,最好让线程在独立状态下工作,让1个控制线程累积结果。