C编程:
当一个线程试图获取互斥锁并且无法获得它时会发生什么?
它会睡觉吗?
当pthread_mutex_unlock(& mutex)时,线程会被唤醒吗?被称为?
然后尝试再次获得锁定?
答案 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)
如果互斥锁已被锁定,则调用线程将阻塞,直到互斥锁变为可用。
(...)
如果调用
mutex
时pthread_mutex_unlock()
引用的互斥锁对象上有线程被阻塞,导致互斥锁变为可用,则调度策略应确定哪个线程将获取互斥锁。
因为
需要“结果”条款(在
PTHREAD_MUTEX_RECURSIVE
互斥锁的情况下,当计数达到零并且调用线程不再对此互斥锁有任何锁定时,互斥锁将变为可用。)