[英]What is the `pthread_mutex_lock()` wake order with multiple threads waiting?
[英]Threads trying to acquire pthread_mutex_lock(&mutex) What happens if they don't get the lock?
C編程:
當一個線程試圖獲取一個互斥鎖並且無法獲得它時會發生什么?
它睡覺了嗎?
線程是否會在pthread_mutex_unlock(&mutex)時被喚醒; 叫做?
然后嘗試再次獲得鎖定?
是的,它是一個阻塞調用,並將阻塞,直到它獲得鎖定。
非阻塞版本是pthread_mutex_trylock(pthread_mutex_t *mutex)
,如果其他人有鎖,則返回EBUSY
如果獲得鎖,則返回0
。 (或者其他一些錯誤,當然)
通常, pthread_mutex_lock
在獲取鎖之前不能返回,即使這意味着它永遠不會返回(死鎖)。 但有一些值得注意的例外情況:
EAGAIN
。 EDEADLK
。 EOWNERDEAD
。 在這種情況下,盡管返回錯誤,調用者仍然保持互斥鎖,並且可以通過調用pthread_mutex_consistent
再次將互斥鎖保護狀態標記為有效。 ENOTRECOVERABLE
並且新所有者首先調用pthread_mutex_unlock
但未首先調用pthread_mutex_consistent
強大互斥鎖,它將返回ENOTRECOVERABLE
。 可能有一些我錯過的案例。 請注意,如果沒有設置robust屬性,這些都不適用於普通互斥鎖( PTHREAD_MUTEX_NORMAL
類型),因此如果您只使用普通互斥鎖,則可以合理地假設調用永遠不會成功返回。
從POSIX標准 :
如果互斥鎖已被鎖定,則調用線程將阻塞,直到互斥鎖變為可用。
(......)
如果存在已被引用的互斥對象上的螺紋
mutex
時pthread_mutex_unlock()
被調用,從而導致該互斥變得可用,調度政策應確定哪個線程應當取得互斥。
因為“必要的”條款是必要的
(對於
PTHREAD_MUTEX_RECURSIVE
互斥鎖,當計數到零並且調用線程不再對此互斥鎖有任何鎖定時,互斥鎖將變為可用。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.