2012-02-13 100 views

回答

1

也許當你故意要線程阻塞?

是的,正是在這種情況下。但是,你可以模仿pthread_mutex_lock()行爲與類似的東西

while(pthread_mutex_trylock(&mtx)) 
    pthread_yield() 
5

pthread_mutex_trylock檢測死鎖。

你可以用它來避免死鎖,但你必須在超時一個循環,纏繞它自己的代碼,有效的多次調用pthread_mutex_trylock做到這一點之後,你的線程釋放所有的資源。

在任何情況下,即使使用pthread_mutex_lock也可以避免死鎖,只要遵循所有線程按相同順序分配資源的簡單規則即可。

如果您只是想有效地等待資源可用,而不必旋轉互斥鎖,那麼通常使用pthread_mutex_lock,而這往往效率非常低。正確設計的多線程應用程序不需要pthread_mutex_trylock變體。

鎖定只能保持最短的工作時間,如果時間太長,通常可以重新設計,這樣鎖定時間就會減少(例如通過使用互斥鎖將數據複製到線程的本地數據區,並且在互斥體被釋放之後長時間運行)。

的僞代碼:

while not pthread_mutex_trylock: 
    yield 

將繼續運行你的線程,等待鎖可用於,尤其因爲在POSIX線程沒有pthread_yield()(儘管它作爲一種非有時提供便攜式擴展)。

這意味着,在最糟糕的情況下,上面的代碼段甚至無法輕鬆產生CPU,因此每次執行調度程序循環時都會嚼碎剩餘的代碼段。

至多,它仍然會激活每個調度程序週期的線程,以查看是否可以獲取互斥鎖。

鑑於:

pthread_mutex_lock 

將最有可能完全暫停你的線程,直到鎖定可,因爲這將其移動到一個等待隊列,直到當前的鎖持有者釋放互斥。

這可能是您應該更喜歡pthread_mutex_lockpthread_mutex_trylock的主要原因。

+0

'正確設計的多線程應用程序不需要pthread_mutex_trylock變體。「請您詳細說明一下這個問題嗎?當你談到「設計合理」時,這意味着什麼?什麼是正確的出路?任何一個真實的例子? – 2012-02-13 09:50:19

+2

Anisha,我的意思是投票互斥是幾乎沒有必要的,因爲如果你不能得到它,你不能做你想要的。人們經常進行輪詢,以便他們可以在線程中執行其他工作,直到可以使用互斥體,但是這樣會破壞線程的整個目的。如果你想在等待的時候發生其他事情,那麼這就是_another_線程的用途。爲了解釋尤達,「線程或線程沒有,沒有嘗試」:-) – paxdiablo 2012-02-16 05:18:26

相關問題