如果我以互斥的相反顺序解锁互斥锁,是否容易陷入死锁?

时间:2018-12-07 03:32:47

标签: c++ multithreading

foo() {
mutex_A.lock()
....
mutex_B.lock()

mutex_B.unlock()
mutex_A.unlock()

}

因此,以上是我为逻辑编写的伪代码。有缺陷吗?

2 个答案:

答案 0 :(得分:4)

不,仅此代码就不会造成死锁。

死锁是指两个线程(或事物)互相等待。解锁互斥锁不会等待任何事情,因此不会导致死锁。

答案 1 :(得分:0)

解锁不会产生死锁。

重要的是锁的顺序,后面可能会产生死锁(每个等待锁互斥锁都被其他功能锁定)。

void problematic_foo() {
    mutex_A.lock()
    mutex_B.lock()

    mutex_B.unlock()
    mutex_A.unlock()
}

void problematic_bar() {
    mutex_B.lock()
    mutex_A.lock()

    mutex_A.unlock()
    mutex_B.unlock()
}

请注意,在c ++ 11中,您可以使用std::lock将多个互斥锁锁定为“一次”:

void foo() {
    std::lock(mutex_A, mutex_B);

    mutex_A.unlock()
    mutex_B.unlock()
}