2011-05-04 89 views
2

假設我使用鎖定層次結構來避免死鎖。如果我使用讀寫器互斥體,我應該如何思考和使用這些互斥體?那裏是否存在(我能想到)每個讀寫器互斥體的層次結構中的獨特讀鎖和寫鎖? (如果是的話,這意味着這兩個鎖可以在層次結構中分配不同的級別。)使用讀寫器互斥鎖是否會在層次結構中引入死鎖的可能性? (如果是的話,可以避免如何(如果有的話))那麼「可升級」鎖(讀卡器鎖可以在沒有解鎖互斥鎖的情況下可以變成寫鎖)呢?鎖定層次結構和讀寫器互斥鎖

是的,我已經看到了建議,以避免(特別是讀寫器)互斥體,如果可能的話。這不是關於是否一般使用它們;只是假設存在一個讀者 - 寫者互斥最好解決的問題。同樣,不要僅僅因爲你一般會喜歡它們而建議鎖定層次結構的替代方案。 (但是,如果將讀寫器互斥體與鎖定層次結合在一起確實會引入死鎖的可能性,請隨時建議修改已使用的概念。)

知道我正在考慮使用多線程程序可能會有幫助Boost線程庫。讀寫器互斥類在那裏被稱爲shared_mutex; unique_lock是獨佔(作家)鎖; shared_lock是一個共享(讀取器)鎖; upgrade_lock是一個讀卡器鎖,可以暫時升級到寫入鎖。

回答

1

您必須將其視爲鎖定順序的單個鎖。如果你有鎖定A和RW鎖定的B,並育有兩個線程做到這一點:

  1. 鎖甲,等待讀取(B)
  2. 鎖寫(B),等待

他們仍然會陷入僵局。

+0

啊,我明白了。但是,我認爲這還不夠。假設他們都這樣做:'讀鎖B,等待升級到寫鎖'。所以至少在使用升級鎖時,必須考慮更多以避免死鎖。對我來說另一個想法是,讀取鎖定互斥鎖仍然允許其他讀者鎖定它。因此,我認爲讀者可能會有更少的訂購要求。 – ecm 2011-05-05 18:29:30

+0

我從來沒有使用具有升級能力的鎖,並且看不到它們如何在沒有死鎖的情況下使用,完全因爲您指定的原因(除非確保一次只有一個線程調用升級)。至於讀者,請記住,如果隊列中有W服務員(以避免飢餓的作者),許多RW鎖不會讓讀者通過。所以你可能無法依靠讀者能夠獲得鎖,即使鎖現在只在R模式下。 – 2011-05-07 04:30:46