遞歸鎖定(互斥鎖)與非遞歸鎖定(互斥鎖POSIX允許互斥鎖遞歸。這意味著同一個線程可以鎖定相同的互斥鎖兩次并且不會死鎖。當然它還需要解鎖兩次,否則沒有其他線程可以獲得互斥鎖。并非所有支持pthread的系統都支持遞歸互斥鎖,但如果它們想要符合POSIX,則必須使用。其他API(更高級別的API)通常也提供互斥鎖,通常稱為鎖定。一些系統/語言(例如Cocoa Objective-C)提供遞歸和非遞歸互斥體。有些語言也只提供一種或另一種語言。例如,在Java中,互斥鎖總是遞歸的(同一個線程可能在同一個對象上“同步”兩次)。根據它們提供的其他線程功能,沒有遞歸互斥體可能沒有問題,因為它們可以很容易地自己編寫(我已經在更簡單的互斥/條件操作的基礎上自己實現了遞歸互斥鎖)。我真的不明白:什么是非遞歸互斥量有用?如果它鎖定相同的互斥鎖兩次,為什么我想要一個線程死鎖?即使是可以避免這種情況的高級語言(例如測試它是否會死鎖并拋出異常)通常也不會這樣做。他們會讓線程陷入僵局。這只適用于我意外鎖定它兩次并且只解鎖一次的情況,并且在遞歸互斥鎖的情況下,它會更難找到問題,所以相反我立即死鎖以查看錯誤鎖定出現在哪里?但是我不能在解鎖時返回一個鎖定計數器,在某種情況下,我確定我已經釋放了最后一個鎖并且計數器不為零,我可以拋出異?;蛴涗泦栴}嗎?或者是否有其他更有用的非遞歸互斥體用例我看不到?或者它可能只是性能,因為非遞歸互斥體可能比遞歸互斥體略快?但是,我對此進行了測試,差異確實不大。
添加回答
舉報
0/150
提交
取消