我有一些對象,每個與boost :: shared_mutex(我需要共享/唯一鎖定功能)相關聯。std :: lock()相當於boost :: shared_mutex?
在某些代碼中,我需要一次獲得多個對象的唯一所有權。
for (FileMetaData* entry : smd->fileSet) {
entry->fileMutex.lock();
}
// some critical work
for (FileMetaData* entry : smd->fileSet) {
entry->fileMutex.unlock();
}
做這樣的事情會導致死鎖,當不同的線程試圖獲得不同的鎖集。
我發現std :: lock()適合我的用例。但是boost :: shared_mutex是否等價?
編輯:
關於有序鎖定模式,這不正是我的情況下工作:
T1 lock (C,D,E)
T2 wants to lock (B,D), but can only obtain the lock for B
T1 spawns T3 which works on (B,C), it stuck when obtaining the lock for B
所以問題是,當T1滋生T3基於B額外的鎖是必需的,這打破了有序的鎖定模式。我認爲這個問題可以解決,如果T2沒有鎖定B鎖定,當D不鎖定,基本上是什麼std ::鎖定。
如果你知道哪些鎖定你需要一次全部 - 即你之前手上整個集合你開始鎖定 - 只需使用任何標準對鎖進行排序並按順序鎖定它們。只要所有線程都遵守相同的鎖定順序,它們就永遠不會死鎖。 (這有時被稱爲「有序鎖定模式」。) – Nemo
@Nemo:下面是各種多鎖算法的性能比較,包括排序算法:http://howardhinnant.github.io/dining_philosophers.html –