【发布时间】:2018-06-10 22:23:38
【问题描述】:
以下代码因多次调用获取非递归互斥锁而挂起:
#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();
}
是否有适合这种情况的单词或短语?我不确定,但我认为这不能恰当地称为死锁:我的理解是,死锁本身是指由于不可逾越的有序获取多个共享资源而导致的僵局.
我一直将其称为“单一互斥锁死锁”,但我想了解是否有更合适的术语/短语。
【问题讨论】:
-
TIL 非递归是不可重入的同义词:en.wikipedia.org/wiki/Reentrant_mutex
-
我认为“死锁”仍然是最合适的术语,尤其是在这样的细化之后。
-
目前尚不清楚您要为两种截然不同的事物中的哪一种寻找术语。您是否试图为相关标准描述此代码的功能找到一个术语?或者您是否试图找到一个术语来描述当您在特定系统上运行此代码时实际发生的情况,并观察到您描述的特定行为?由于这是符合标准的 UB,因此它们是两个非常不同的东西。