是否存在单个互斥锁死锁的术语" (具有非递归互斥锁的死锁类型情况)?

时间:2017-12-31 05:12:38

标签: c++ 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();
}

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

我曾经传闻称这是一个&#34;单一的互斥锁僵局&#34;但我想知道是否有更合适的术语/短语。

3 个答案:

答案 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,则尝试递归锁定互斥锁会导致未定义的行为。