首页 > 解决方案 > 为什么这段代码不会导致死锁?

问题描述

我有下面的代码,其中函数 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();
} 

标签: c++mutexdeadlock

解决方案


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

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

是什么PTHREAD_MUTEX_DEFAULT?这几乎是您所期望的:

type 属性的默认值为 PTHREAD_MUTEX_DEFAULT。

...

实现可以将 PTHREAD_MUTEX_DEFAULT 映射到其他互斥体类型之一。

您期望您的互斥锁PTHREAD_MUTEX_NORMAL会在这里导致死锁。但是,您的特定线程实现似乎是PTHREAD_MUTEX_RECURSIVE类型,它可以被同一个进程多次锁定。这是您正在观察的行为。


推荐阅读