C编程:线程试图获取pthread_mutex_lock(&mutex)如果他们没有获取锁,会发生什么?
线程尝试获取互斥锁并且无法获取它时会发生什么?
它会睡觉吗?
pthread_mutex_unlock(& mutex)会唤醒线程;叫做?
然后尝试再次获取锁定?
C编程:线程试图获取pthread_mutex_lock(&mutex)如果他们没有获取锁,会发生什么?
线程尝试获取互斥锁并且无法获取它时会发生什么?
它会睡觉吗?
pthread_mutex_unlock(& mutex)会唤醒线程;叫做?
然后尝试再次获取锁定?
是的,这是一个阻塞呼叫,并将阻塞,直到它获得锁定。
非阻塞版本是pthread_mutex_trylock(pthread_mutex_t *mutex)
,如果其他人有锁,将返回EBUSY
;如果有锁,则将返回0
。 (或者其他一些错误,当然)
如果互斥已经锁定,调用线程将阻塞,直到互斥体变得可用。
(...)
如果有成为可阻断
mutex
当pthread_mutex_unlock()
被称为引用的互斥对象的线程,导致互斥,调度策略将决定哪个线程应当取得互斥。
凡“造成”的条款是必要的,因为
(在
PTHREAD_MUTEX_RECURSIVE
互斥体的情况下,互斥应当计数达到零并且调用线程不再有任何锁定可用这个互斥。)
通常,pthread_mutex_lock
不能返回,直到它获得锁,即使这意味着它永远不会返回(死锁)。但有一些值得注意的例外:
EAGAIN
。EDEADLK
如果线程试图锁定它已经锁定的互斥锁。EOWNERDEAD
。在这种情况下,尽管得到错误返回,调用者仍持有互斥锁,并可通过调用pthread_mutex_consistent
再次将互斥锁保护状态标记为有效。pthread_mutex_unlock
且首先未调用pthread_mutex_consistent
的强健互斥锁,它将返回ENOTRECOVERABLE
。可能有几个我错过了。请注意,这些都不适用于没有健壮属性集的普通互斥体(PTHREAD_MUTEX_NORMAL
类型),因此如果您只使用普通互斥锁,则可以合理地假定调用永远不会成功返回。
谢谢。这回答了我的问题。 –