尝试获取pthread_mutex_lock(& mutex)的线程如果他们没有获得锁定会发生什么?

时间:2011-03-11 00:54:00

标签: c pthreads mutex locks

C编程:

当一个线程试图获取互斥锁并且无法获得它时会发生什么?

它会睡觉吗?

当pthread_mutex_unlock(& mutex)时,线程会被唤醒吗?被称为?

然后尝试再次获得锁定?

4 个答案:

答案 0 :(得分:8)

来自man page

  

pthread_mutex_lock() 功能会锁定互斥锁。如果互斥锁已被锁定,则调用线程将阻塞,直到互斥锁变为可用。

所以是的 - 你的线程被锁定,直到锁定可用并且可以获得它。

答案 1 :(得分:3)

是的,这是一个阻止调用,并将阻塞直到它获得锁定。

非阻止版本为pthread_mutex_trylock(pthread_mutex_t *mutex),如果其他人拥有锁定,则会返回EBUSY,如果获得锁定,则返回0。 (当然还是其他一些错误)

答案 2 :(得分:3)

通常情况下,pthread_mutex_lock在获取锁之前无法返回,即使这意味着它永远不会返回(死锁)。但是有一些值得注意的例外:

  • 对于递归互斥锁,如果超出最大引用计数,它可以返回EAGAIN
  • 对于错误检查互斥锁,如果线程试图锁定已经锁定的互斥锁,它可以返回EDEADLK
  • 对于健壮的互斥锁,如果另一个进程在保持(共享)互斥锁时死亡,它可以返回EOWNERDEAD。在这种情况下,尽管返回错误,调用者仍然持有互斥锁,并且可以通过调用pthread_mutex_consistent再次将互斥锁保护状态标记为有效。
  • 对于其所有者已经死亡并且新所有者首先调用pthread_mutex_unlock但未先调用pthread_mutex_consistent的强健互斥锁,它将返回ENOTRECOVERABLE

我可能会错过一些案例。请注意,如果没有设置robust属性,这些都不适用于普通互斥锁(PTHREAD_MUTEX_NORMAL类型),因此如果您只使用普通互斥锁,则可以合理地假设调用永远不会返回而不会成功。

答案 3 :(得分:0)

来自POSIX standard

  

如果互斥锁已被锁定,则调用线程将阻塞,直到互斥锁变为可用。

     

(...)

     

如果调用mutexpthread_mutex_unlock()引用的互斥锁对象上有线程被阻塞,导致互斥锁变为可用,则调度策略应确定哪个线程将获取互斥锁。

因为

需要“结果”条款
  

(在PTHREAD_MUTEX_RECURSIVE互斥锁的情况下,当计数达到零并且调用线程不再对此互斥锁有任何锁定时,互斥锁将变为可用。)