为什么在C ++中正确使用互斥锁?

时间:2019-10-24 11:18:08

标签: c++ c++11 mutex

之前有人问过我关于互斥锁的问题,代码可以正常工作,但是我对此结果感到困惑:

::std::mutex s_mutex;
void funcA()
{
    s_mutex.lock();

    printf( "funcA \n" );

    s_mutex.unlock();
}

void funcB()
{
    s_mutex.lock();

    funcA();

    printf( "funcB \n" );

    s_mutex.unlock();
}

int main()
{
    funcB();

    return 0;
}

它可以正常工作并打印我不希望看到的内容:

funcA 
funcB 

但是为什么呢?该函数在主线程中被调用,并且似乎两次调用了锁。

2 个答案:

答案 0 :(得分:0)

来自std::mutex::lock()

  

如果ArrayList由已经拥有互斥锁的线程调用,则行为未定义:例如,程序可能死锁。建议使用能够检测到无效用法的实现来抛出带有错误条件lock的{​​{1}}而不是死锁。

答案 1 :(得分:0)

如@Quentin所述,从一个线程多次锁定std::mutex会导致未定义的行为。要允许线程多次锁定互斥对象,可以使用std::recursive_mutex

  

递归互斥锁是可锁定的对象,就像互斥锁一样,但是允许   同一线程在互斥体上获得多个级别的所有权   对象。

     

这允许从一个线程中锁定(或尝试锁定)互斥对象   已经锁定它,在   互斥对象:互斥对象实际上将保持锁定状态   线程,直到其成员解锁被调用为此级别的次数   所有权。