2017-07-24 143 views
1

我好奇地嘗試了一些東西,它似乎不起作用。在同樣的功能我做成功的互斥鎖鎖定

std::mutex mtx1,mtx2; 
mtx1.lock(); 
mtx2.lock(); 
mtx1.unlock(); 
mtx2.unlock(); 

然後,我啓動它的幾個線程。它出乎意料地(對我來說)完成了僵局。 我想明白爲什麼。

(誰是想知道爲什麼我想知道這樣的事情,當時的想法是創建一個互斥字典,並保護前往該字典互斥) 感謝

+0

這看起來很像5餐哲學家的問題:https://en.wikipedia.org/wiki/Dining_philosophers_problem – IlBeldus

+2

不要手動鎖定互斥鎖!使用'std :: lock_guard'或'std :: unique_lock'。我們已經不再是90年代了。最壞的情況,編寫你自己的RAII類來鎖定和解鎖。 –

+0

這些也是(如果自然使用的話)保證以相反的鎖定順序解鎖,這是避免嵌套互斥鎖通常的規則。 – Useless

回答

0

代碼,你在評論欄目發帖是不同的從你問題中的問題。你的順序是這樣的:

mtx1.lock(); // 1 
mtx2.lock(); // 2 
mtx1.unlock(); // 3 
       // 4 
mtx1.lock(); // 5 
mtx2.unlock(); // 6 
mtx1.lock(); // 7 

一個線程獲取mtx2並試圖鎖定mtx1(5號線)。另一個線程鎖定mtx1,然後繼續鎖定mtx2(第2行)。

您正在對兩個互斥鎖使用不同的鎖定順序。這是死鎖的典型例子。

總是應該以相同的順序獲取鎖以避免死鎖。解鎖可以按任何順序完成。