是否有一个术语来表示"single mutex deadlock"(具有非递归互斥锁的死锁类型情况)?



以下代码挂起,因为多次调用以获取非递归互斥锁:

#include <pthread.h>
class Lock
{
public:
Lock( pthread_mutex_t& mutex )
: mutex_( mutex )
{
pthread_mutex_lock( &mutex_ );
}
~Lock()
{
pthread_mutex_unlock( &mutex_ );
}
private:
pthread_mutex_t& mutex_;
};
class Foo
{
public:
Foo()
{
pthread_mutex_init( &mutex_, NULL );
}
~Foo()
{
pthread_mutex_destroy( &mutex_ );
}
void hang()
{
Lock l( mutex_ );
subFunc();
}
void subFunc()
{
Lock l( mutex_ );
}
private:
pthread_mutex_t mutex_;
};
int main()
{
Foo f;
f.hang();
}

这种情况有词或短语吗?我不确定,但我认为这不能恰当地称为死锁:我的理解是,死锁本身是指由于无法通过有序地获取多个共享资源而导致的僵局。

我一直在轶事中称其为"单一互斥死锁",但我想了解是否有更合适的术语/短语。

维基百科关于可重入互斥体的文章引用了面向模式的软件架构,其中使用了术语"自我死锁"。这个词对我来说似乎很合理!

。互斥体有两种基本风格:递归和非递归。递归互斥锁允许重入锁定,其中已经锁定互斥锁的线程可以再次锁定它并继续前进。相比之下,非递归互斥锁则不能:同一线程中的第二个锁会导致自死锁。非递归互斥锁的锁定和解锁速度可能比递归互斥锁快得多,但自死锁的风险意味着当对象直接或通过回调调用任何方法时必须小心,因为双重锁定会导致线程挂起。

(着重号后加)

跨各种技术的各种搜索结果证实了该术语的使用。

  • https://docs.oracle.com/cd/E19253-01/816-5137/guide-35930/index.html
  • https://support.microsoft.com/en-in/help/2963138/fix-parallel-deadlock-or-self-deadlock-occurs-when-you-run-a-query-tha
  • https://issues.apache.org/jira/browse/DERBY-6692
  • https://github.com/citusdata/citus/issues/1572
">

self deadlock"或"recursive deadlock"。

根据手册,这是从同一线程锁定默认初始化mutex两次的未定义行为

如果互斥锁类型PTHREAD_MUTEX_DEFAULT,则尝试递归锁定互斥锁会导致未定义的行为。

最新更新