Std::Lock avoids deadlock but this program gets stuck

sud*_*rbb 5 c++ multithreading mutex thread-synchronization c++11

All, Referring to the question in std::lock still caused deadlock

I still couldn't figure what is the problem in the below code. Can somebody please explain the problem and how to fix this? Why does it get hung? Pls help.

#include <iostream>
#include <mutex>
#include <thread>
using namespace std;

std::mutex m1;
std::mutex m2;

void func1()
{
    std::unique_lock<std::mutex> lock1(m1, std::defer_lock);
    printf("func1 lock m1\n");
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::unique_lock<std::mutex> lock2(m2, std::defer_lock);
    printf("func1 lock m2\n");
    std::lock(m1, m2);
    printf("func1 std lock\n");

}

void func2()
{
    std::unique_lock<std::mutex> lock1(m2, std::defer_lock);
    printf("func2 lock m2\n");
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::unique_lock<std::mutex> lock2(m1, std::defer_lock);
    printf("func2 lock m1\n");
    std::lock(m1, m2);
    printf("func2 std lock\n");
}



int main(int argc,char* argv[])
{
    std::thread th1(func1);
    std::thread th2(func2);
    th1.join();
    th2.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Output seen: func1 lock m1
func2 lock m2
func1 lock m2
func1 std lock
func2 lock m1
----- Hung here.

即使func1释放了两个互斥锁,为什么func2仍不继续?

San*_*ker 12

代替 :

std::lock(m1, m2);
Run Code Online (Sandbox Code Playgroud)

使用 :

std::lock(lock1, lock2);
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息(包括示例),请参见参考页std::lock

为什么您的代码挂起?

调用时std::lock(m1, m2),两个互斥锁直接锁定。无论是的std::unique_lockS(lock1lock2)都意识到这一点,因此,他们无法解锁互斥。

因此,当func1结束时,两个互斥锁仍处于锁定状态,并且func2无法越过该std::lock(m1, m2)行。

固定代码为什么起作用?

当您调用时std::lock(lock1, lock2)std::unique_locks(lock1lock2)意识到这一点-它们现在拥有锁,并负责解锁(当锁超出范围时会发生)。

因此,当func1结束时,两个互斥锁都被解锁,并且func2 可以越过该std::lock(lock1, lock2)行。一切都很好。

  • 在C ++ 17中,您也可以使用`std :: scoped_lock l(m1,m2);`而不需要`unique_lock`对象。 (2认同)