2011-03-11 35 views

回答

4

man page

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

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

+0

謝謝。這回答了我的問題。 –

1

是的,這是一個阻塞呼叫,並將阻塞,直到它獲得鎖定。

非阻塞版本是pthread_mutex_trylock(pthread_mutex_t *mutex),如果其他人有鎖,將返回EBUSY;如果有鎖,則將返回0。 (或者其他一些錯誤,當然)

0

POSIX standard

如果互斥已經鎖定,調用線程將阻塞,直到互斥體變得可用。

(...)

如果有成爲可阻斷mutexpthread_mutex_unlock()被稱爲引用的互斥對象的線程,導致互斥,調度策略將決定哪個線程應當取得互斥。

凡「造成」的條款是必要的,因爲

(在PTHREAD_MUTEX_RECURSIVE互斥體的情況下,互斥應當計數達到零並且調用線程不再有任何鎖定可用這個互斥。)

1

通常,pthread_mutex_lock不能返回,直到它獲得鎖,即使這意味着它永遠不會返回(死鎖)。但有一些值得注意的例外:

  • 對於遞歸互斥,如果超過最大引用計數,它可以返回EAGAIN
  • 對於錯誤檢查互斥鎖,它可以返回EDEADLK如果線程試圖鎖定它已經鎖定的互斥鎖。
  • 對於強大的互斥鎖,如果另一個進程在保持(共享)互斥鎖時死亡,它可以返回EOWNERDEAD。在這種情況下,儘管得到錯誤返回,調用者仍持有互斥鎖,並可通過調用pthread_mutex_consistent再次將互斥鎖保護狀態標記爲有效。
  • 對於所有者死亡並且新所有者稱爲pthread_mutex_unlock且首先未調用pthread_mutex_consistent的強健互斥鎖,它將返回ENOTRECOVERABLE

可能有幾個我錯過了。請注意,這些都不適用於沒有健壯屬性集的普通互斥體(PTHREAD_MUTEX_NORMAL類型),因此如果您只使用普通互斥鎖,則可以合理地假定調用永遠不會成功返回。

相關問題