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

Why does this code not cause a dead-lock?

我有下面的代码,其中函数 bar 锁定互斥量然后调用函数 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();
} 

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

If the mutex type is PTHREAD_MUTEX_DEFAULT, the behavior of pthread_mutex_lock() may correspond to one of the three other standard mutex types

什么是PTHREAD_MUTEX_DEFAULT?那是 pretty much what you expect:

The default value of the type attribute is PTHREAD_MUTEX_DEFAULT.

...

An implementation may map PTHREAD_MUTEX_DEFAULT to one of the other mutex types.

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

You need to modify bar() as: 
void bar()  
{  
       pthread_mutex_lock(&mutex);  
        cout<<"excuting bar!!"<<endl;
        pthread_mutex_unlock(&mutex); 
        foo();  

}

在您的代码中,存在死锁,因为顺序如下 1. bar() 锁定互斥量, 2. Foo() 尝试再次锁定已被 bar 锁定的互斥量 3. bar() 解锁,但是之前操作步骤2,还在等待mutex。此步骤等待步骤 2 完成