为什么此代码不会导致死锁?

问题描述 投票:0回答:1

我有下面的代码,其中功能栏锁定互斥锁,然后调用功能foo,但是功能foo锁定相同的互斥锁。根据我的理解,死锁将发生,因为foo试图锁定同一互斥锁,并且该互斥锁已锁定在功能栏中。但是下面的代码执行没有任何停止。谁知道原因?

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void foo()  
{  
    pthread_mutex_lock(&mutex);  
    cout<<"excuting foo!!"<<endl;
    pthread_mutex_unlock(&mutex);  
}  

void bar()  
{  
    pthread_mutex_lock(&mutex);  
    cout<<"excuting bar!!"<<endl;
    foo();  
    pthread_mutex_unlock(&mutex);  
}


int main()
{
    bar();
} 
c++ mutex deadlock
1个回答
0
投票

POSIX thread specification允许POSIX线程实现使用标准的三种互斥类型中的任何一种作为默认互斥类型:

如果互斥锁类型为PTHREAD_MUTEX_DEFAULT,则pthread_mutex_lock()可能对应于其他三个标准之一互斥锁类型

什么是“ PTHREAD_MUTEX_DEFAULT”?那是pretty much what you expect

一个实现可以将PTHREAD_MUTEX_DEFAULT映射到另一个互斥锁类型。

您期望自己的互斥锁为PTHREAD_MUTEX_NORMAL,这将在此处导致死锁。但是,您的特定线程实现似乎是PTHREAD_MUTEX_RECURSIVE类型,可以通过同一进程多次锁定。这是您正在观察的行为。

© www.soinside.com 2019 - 2024. All rights reserved.