死鎖不僅僅是在使用鎖的時候發生(盡管這是最常見的),建立兩個線程,在每個線程中調用對方的join函數,這時候也會造成死鎖。兩個線程都在等待對方先結束。避免死鎖有一個最簡單的原則:如果這個線程可能等待你,那麼你就不要等待這個線程。
1、避免給一個鎖嵌套上鎖
在持有一個鎖的時候,不要再給這個鎖上鎖。如果使用多個鎖,使用std::lock。
2、在持有鎖時,不要調用别人提供的函數
因為你不清楚别人的代碼怎麼實作的,不知道它是不是在使用鎖。
3、給多個鎖上鎖時,固定順序。
如果在給多個所上鎖,并且無法使用std::lock,最好的做法就是在每一個線程中,都按照同樣的順序。
4、分層次來使用鎖
把程式分成幾個層次。區分每個層次中使用的鎖,當一個線程已經持有更低層次的鎖時,不允許使用高層次的鎖。可以在程式運作時給不同的鎖加上層次号,記錄每個線程持有的鎖。
未來星開發團隊--狒狒
QQ:9715234