遞歸鎖定(互斥鎖)與非遞歸鎖定(互斥鎖POSIX允許互斥鎖遞歸。這意味著同一個(gè)線(xiàn)程可以鎖定相同的互斥鎖兩次并且不會(huì)死鎖。當(dāng)然它還需要解鎖兩次,否則沒(méi)有其他線(xiàn)程可以獲得互斥鎖。并非所有支持pthread的系統(tǒng)都支持遞歸互斥鎖,但如果它們想要符合POSIX,則必須使用。其他API(更高級(jí)別的API)通常也提供互斥鎖,通常稱(chēng)為鎖定。一些系統(tǒng)/語(yǔ)言(例如Cocoa Objective-C)提供遞歸和非遞歸互斥體。有些語(yǔ)言也只提供一種或另一種語(yǔ)言。例如,在Java中,互斥鎖總是遞歸的(同一個(gè)線(xiàn)程可能在同一個(gè)對(duì)象上“同步”兩次)。根據(jù)它們提供的其他線(xiàn)程功能,沒(méi)有遞歸互斥體可能沒(méi)有問(wèn)題,因?yàn)樗鼈兛梢院苋菀椎刈约壕帉?xiě)(我已經(jīng)在更簡(jiǎn)單的互斥/條件操作的基礎(chǔ)上自己實(shí)現(xiàn)了遞歸互斥鎖)。我真的不明白:什么是非遞歸互斥量有用?如果它鎖定相同的互斥鎖兩次,為什么我想要一個(gè)線(xiàn)程死鎖?即使是可以避免這種情況的高級(jí)語(yǔ)言(例如測(cè)試它是否會(huì)死鎖并拋出異常)通常也不會(huì)這樣做。他們會(huì)讓線(xiàn)程陷入僵局。這只適用于我意外鎖定它兩次并且只解鎖一次的情況,并且在遞歸互斥鎖的情況下,它會(huì)更難找到問(wèn)題,所以相反我立即死鎖以查看錯(cuò)誤鎖定出現(xiàn)在哪里?但是我不能在解鎖時(shí)返回一個(gè)鎖定計(jì)數(shù)器,在某種情況下,我確定我已經(jīng)釋放了最后一個(gè)鎖并且計(jì)數(shù)器不為零,我可以?huà)伋霎惓;蛴涗泦?wèn)題嗎?或者是否有其他更有用的非遞歸互斥體用例我看不到?或者它可能只是性能,因?yàn)榉沁f歸互斥體可能比遞歸互斥體略快?但是,我對(duì)此進(jìn)行了測(cè)試,差異確實(shí)不大。
遞歸鎖定(互斥鎖)與非遞歸鎖定(互斥鎖)
繁花不似錦
2019-08-14 17:16:56