之前有人问过我关于互斥锁的问题,代码可以正常工作,但是我对此结果感到困惑:
::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
但是为什么呢?该函数在主线程中被调用,并且似乎两次调用了锁。
答案 0 :(得分:0)
如果
ArrayList
由已经拥有互斥锁的线程调用,则行为未定义:例如,程序可能死锁。建议使用能够检测到无效用法的实现来抛出带有错误条件lock
的{{1}}而不是死锁。
答案 1 :(得分:0)
如@Quentin所述,从一个线程多次锁定std::mutex
会导致未定义的行为。要允许线程多次锁定互斥对象,可以使用std::recursive_mutex。
递归互斥锁是可锁定的对象,就像互斥锁一样,但是允许 同一线程在互斥体上获得多个级别的所有权 对象。
这允许从一个线程中锁定(或尝试锁定)互斥对象 已经锁定它,在 互斥对象:互斥对象实际上将保持锁定状态 线程,直到其成员解锁被调用为此级别的次数 所有权。