以下代码因多次调用获取非递归互斥锁而挂起:
#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();
}
这种情况是否有单词或短语?我不确定,但我不认为这可以恰当地称为死锁:我理解死锁是指由于无法有序获取多重而导致的僵局共享资源。
我曾经传闻称这是一个&#34;单一的互斥锁僵局&#34;但我想知道是否有更合适的术语/短语。
答案 0 :(得分:2)
The Wikipedia article on reentrant mutexes引用使用“自我死锁”一词的Pattern-Oriented Software Architecture,。这个词对我来说似乎很合理!
...互斥体有两种基本风格:递归和非递归。递归互斥锁允许重入锁定,其中已锁定互斥锁的线程可以再次锁定它并继续进行。相反,非递归互斥锁不能:同一线程中的第二个锁导致自死锁。非递归互斥锁的锁定和解锁可能比递归互斥锁更快,但风险更大self-deadlock意味着当一个对象直接或通过回调调用自身的任何方法时必须小心,因为双重锁定会导致线程挂起。
(强调补充)
各种技术的各种搜索结果证实了这一术语的使用。
答案 1 :(得分:1)
“自我死锁”或“递归死锁”。
答案 2 :(得分:1)
根据manual这是未定义的行为来从同一个线程锁定默认的初始化let yourIndexSet: IndexSet = [1, 2, 3, 5, 6, 7, 13, 31]
let desiredIndexRange = IndexSet(3...13)
let indicesOfInterest = yourIndexSet.intersection(desiredIndexRange)
print(indicesOfInterest.sorted()) // => [3, 5, 6, 7, 13]
两次:
如果互斥锁类型为PTHREAD_MUTEX_DEFAULT,则尝试递归锁定互斥锁会导致未定义的行为。