【发布时间】:2011-07-13 04:11:40
【问题描述】:
C 编程:
当线程尝试获取互斥锁但未能获取时会发生什么?
它会睡觉吗?
pthread_mutex_unlock(&mutex); 时会不会唤醒线程?叫什么?
然后再尝试获取锁?
【问题讨论】:
C 编程:
当线程尝试获取互斥锁但未能获取时会发生什么?
它会睡觉吗?
pthread_mutex_unlock(&mutex); 时会不会唤醒线程?叫什么?
然后再尝试获取锁?
【问题讨论】:
来自man page:
pthread_mutex_lock()函数锁定mutex。如果互斥锁已被锁定,则调用线程将阻塞,直到互斥锁可用。
所以是的 - 你的线程被阻塞,直到锁可用并且它可以获得它。
【讨论】:
是的,它是一个阻塞调用,并且会阻塞直到它获得锁。
非阻塞版本是pthread_mutex_trylock(pthread_mutex_t *mutex),如果其他人有锁,则返回EBUSY,如果有锁,则返回0。 (当然也可以是其他错误)
【讨论】:
通常,pthread_mutex_lock 在获得锁之前无法返回,即使这意味着它永远不会返回(死锁)。不过也有一些值得注意的例外:
EAGAIN。EDEADLK。EOWNERDEAD。在这种情况下,尽管返回错误,调用者仍持有互斥锁,并可以通过调用 pthread_mutex_consistent 再次将受互斥保护的状态标记为有效。pthread_mutex_unlock 而未先调用 pthread_mutex_consistent 的健壮互斥体,它将返回 ENOTRECOVERABLE。我可能错过了一些案例。请注意,这些都不适用于没有设置健壮属性的普通互斥锁(PTHREAD_MUTEX_NORMAL 类型),因此如果您只使用普通互斥锁,您可以合理地假设调用不会成功返回。
【讨论】:
如果互斥锁已经被锁定,调用线程将阻塞直到互斥锁可用。
(...)
如果在调用
pthread_mutex_unlock()时,mutex引用的互斥对象上有线程阻塞,导致互斥锁可用,则调度策略应确定哪个线程应获取互斥锁。
“resulting in”子句是必要的,因为
(在
PTHREAD_MUTEX_RECURSIVE互斥体的情况下,当计数达到零并且调用线程不再对该互斥体拥有任何锁时,互斥体将变为可用。)
【讨论】: