我有下面的代码,其中功能栏锁定互斥锁,然后调用功能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线程实现使用标准的三种互斥类型中的任何一种作为默认互斥类型:
如果互斥锁类型为PTHREAD_MUTEX_DEFAULT,则pthread_mutex_lock()可能对应于其他三个标准之一互斥锁类型
什么是“ PTHREAD_MUTEX_DEFAULT”?那是pretty much what you expect:
一个实现可以将PTHREAD_MUTEX_DEFAULT映射到另一个互斥锁类型。
您期望自己的互斥锁为PTHREAD_MUTEX_NORMAL
,这将在此处导致死锁。但是,您的特定线程实现似乎是PTHREAD_MUTEX_RECURSIVE
类型,可以通过同一进程多次锁定。这是您正在观察的行为。