簡體   English   中英

嘗試獲取pthread_mutex_lock(&mutex)的線程如果他們沒有獲得鎖定會發生什么?

[英]Threads trying to acquire pthread_mutex_lock(&mutex) What happens if they don't get the lock?

C編程:

當一個線程試圖獲取一個互斥鎖並且無法獲得它時會發生什么?

它睡覺了嗎?

線程是否會在pthread_mutex_unlock(&mutex)時被喚醒; 叫做?

然后嘗試再次獲得鎖定?

手冊頁

pthread_mutex_lock()函數鎖定互斥鎖 如果互斥鎖已被鎖定,則調用線程將阻塞,直到互斥鎖變為可用。

所以是的 - 你的線程被鎖定,直到鎖可用並且它可以獲得它。

是的,它是一個阻塞調用,並將阻塞,直到它獲得鎖定。

非阻塞版本是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標准

如果互斥鎖已被鎖定,則調用線程將阻塞,直到互斥鎖變為可用。

(......)

如果存在已被引用的互斥對象上的螺紋mutexpthread_mutex_unlock()被調用,從而導致該互斥變得可用,調度政策應確定哪個線程應當取得互斥。

因為“必要的”條款是必要的

(對於PTHREAD_MUTEX_RECURSIVE互斥鎖,當計數到零並且調用線程不再對此互斥鎖有任何鎖定時,互斥鎖將變為可用。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM