如果C中的线程试图获取已有的锁,会发生什么?

Fua*_*uad 1 c multithreading mutex locking pthreads

因此,假设1个线程,线程通过以下方式获取锁定:

pthread_mutex_lock(&lock);
Run Code Online (Sandbox Code Playgroud)

然后在解锁之前,它再次到达一条线:

pthread_mutex_lock(&lock);
Run Code Online (Sandbox Code Playgroud)

pthread库是否会阻止线程的进展,还是会识别出线程已经持有锁,从而让它通过?

Ant*_*ala 7

行为取决于互斥锁的类型.该POSIX标准说,递归锁定行为取决于锁的类型

如果某个线程尝试重新锁定它已锁定的互斥锁,则其pthread_mutex_lock()行为应如下表的Relock列中所述.

随着Relock专栏的说法

  • 类型的互斥锁PTHREAD_MUTEX_NORMAL应该死锁
  • 类型的互斥锁PTHREAD_MUTEX_ERRORCHECK应返回错误
  • 类型的互斥锁PTHREAD_MUTEX_RECURSIVE将作为递归锁定,然后您必须解锁锁定它的次数
  • 类型的互斥体PTHREAD_MUTEX_DEFAULT将具有未定义的行为,这实际上意味着如果在该平台上默认锁定是前3种类型中的任何一种,它将在上面的列中表现出特征性,如果它是其他类型,那么行为将不确定.

因此,有尤其是在没有点测试一个PTHREAD_MUTEX_DEFAULT锁,以找出行为是什么.

Linux指南手册pthread_mutex_lock(3) rephrases有以下几点:

如果互斥锁已被调用线程锁定,则pthread_mutex_lock的行为取决于互斥锁的类型.如果互斥锁是 快速 类型,则调用线程将被挂起,直到互斥锁被解锁,从而有效地导致调用线程死锁.如果互斥锁是错误检查类型,则pthread_mutex_lock会立即返回错误代码EDEADLK.如果互斥锁是递归 类,则 pthread_mutex_lock 成功并立即返回,记录调用线程锁定互斥锁的次数.pthread_mutex_unlock在互斥锁返回解锁状态之前,必须执行相同数量的操作.

在Linux中根据文档,默认类型很快,但你不能依赖它是可移植的.