首页 > 解决方案 > 为什么在 C++ 中互斥锁的使用是正确的?

问题描述

我之前被问过一个关于互斥锁的问题,代码工作正常,但我对这个结果感到困惑:</p>

::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;
}

它工作正常,打印出我没想到的:</p>

funcA 
funcB 

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

标签: c++c++11mutex

解决方案


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

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

这允许从已经锁定它的线程锁定(或尝试锁定)互斥对象,从而获得对互斥对象的新级别所有权:互斥对象实际上将保持锁定拥有线程,直到其成员解锁被称为很多倍于这个级别的所有权。


推荐阅读