2014-10-08 16 views
4

我想檢查互斥鎖是否空閒並且不被獲取。如何檢查是否沒有獲取互斥鎖?

我試圖用pthread_mutex_trylock(mutex_object);

但是,如果返回互斥量被收購了0-1錯誤。

如果沒有獲取互斥量,該怎麼辦?它會爲它返回任何價值嗎?

回答

12

pthread_mutex_trylock不返回「-1表示錯誤」。它從errno.h中的可能值返回一個「錯誤」代碼。其中之一EBUSY意味着另一個線程已經擁有該鎖。除非程序中存在嚴重的錯誤,否則您不應該觀察pthread_mutex_trylock中的任何其他錯誤代碼。

請注意,對於遞歸互斥鎖,返回值0不區分互斥鎖先前已解鎖的情況和調用線程已擁有它的情況。在任何情況下,如果pthread_mutex_trylock返回0,那麼在您成爲pthread_mutex_trylock後您成爲所有者(或者,在遞歸情況下,鎖計數增加1),您將負責通過pthread_mutex_unlock解鎖。

6

pthread_mutex_trylock獲取調用線程的互斥鎖或返回EBUSY如果互斥鎖當前被鎖定。這是測試互斥鎖是否被鎖定的唯一有意義的方法。在多線程環境中,只檢查「是否有其他人持有該互斥鎖」的函數是無用的,因爲函數立即返回另一個線程可以獲取互斥鎖。

0

您通常使用pthread_mutex_lock,trylock是一個更深奧的非阻塞變體,用於避免優先級反轉場景中的死鎖。如果你獲得0回報,互斥量是免費的,現在被你鎖定。