2011-03-11 31 views

回答

4

man page

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

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

+0

谢谢。这回答了我的问题。 –

1

是的,这是一个阻塞呼叫,并将阻塞,直到它获得锁定。

非阻塞版本是pthread_mutex_trylock(pthread_mutex_t *mutex),如果其他人有锁,将返回EBUSY;如果有锁,则将返回0。 (或者其他一些错误,当然)

0

POSIX standard

如果互斥已经锁定,调用线程将阻塞,直到互斥体变得可用。

(...)

如果有成为可阻断mutexpthread_mutex_unlock()被称为引用的互斥对象的线程,导致互斥,调度策略将决定哪个线程应当取得互斥。

凡“造成”的条款是必要的,因为

(在PTHREAD_MUTEX_RECURSIVE互斥体的情况下,互斥应当计数达到零并且调用线程不再有任何锁定可用这个互斥。)

1

通常,pthread_mutex_lock不能返回,直到它获得锁,即使这意味着它永远不会返回(死锁)。但有一些值得注意的例外:

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

可能有几个我错过了。请注意,这些都不适用于没有健壮属性集的普通互斥体(PTHREAD_MUTEX_NORMAL类型),因此如果您只使用普通互斥锁,则可以合理地假定调用永远不会成功返回。

相关问题