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
類型),因此如果您只使用普通互斥鎖,則可以合理地假定調用永遠不會成功返回。
謝謝。這回答了我的問題。 –