为什么在C++中互斥的使用是正确的

Why is the usage of mutex correct in C++?

本文关键字:C++ 为什么      更新时间:2023-10-16

之前有人问我一个关于互斥的问题,代码运行良好,但我对这个结果感到困惑:

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

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

来自std::mutex::lock():

如果lock由已经拥有互斥的线程调用,则行为未定义:例如,程序可能死锁。鼓励能够检测无效用法的实现抛出具有错误条件resource_deadlock_would_occurstd::system_error,而不是死锁。

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

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

这允许从一个线程锁定(或尝试锁定(互斥对象已经锁定了它,获得了对互斥对象:拥有线程直到其成员解锁为止的调用次数与此级别一样多所有权。