【问题标题】:Is there a term for a "single mutex deadlock" (deadlock-type situation with non-recursive mutex)?是否有“单个互斥锁死锁”的术语(非递归互斥锁的死锁类型情况)?
【发布时间】: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,因此它们是两个非常不同的东西。

标签: c++ mutex deadlock


【解决方案1】:

The Wikipedia article on reentrant mutexes 引用了Pattern-Oriented Software Architecture,,它使用了术语“自死锁”。这个词对我来说似乎很合理!

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

(强调)

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

【讨论】:

    【解决方案2】:

    “自死锁”或“递归死锁”。

    【讨论】:

    • 这些术语的资源,或论文/文档中的用法,请! (我并不是说这个答案是“错误的”,但它肯定可以使用一些支持信息 - 一个简单的链接摘录/摘要/理由可以有很长的路要走。)
    【解决方案3】:

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

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

    【讨论】:

    • 我同意。我称之为“由于不正确使用互斥锁而导致的死锁”。
    • 同样按照手册:"如果互斥锁类型为PTHREAD_MUTEX_NORMAL,则不提供死锁检测。尝试重新锁定互斥锁会导致死锁。"
    • @RaymondChen 但是没有说它在所有实现pthreads 的系统上总是死锁。它是未定义
    • @Galik 是的,所以它是“X 由于不正确使用互斥锁”,其中 X 是您观察到的行为(死锁、内存损坏、排除违规等)在这种情况下,X 是“死锁” .
    猜你喜欢
    • 2010-09-16
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多