死鎖不單單是在使用鎖的時候發生(儘管這是最多見的),建立兩個線程,在每一個線程中調用對方的join函數,這時候也會形成死鎖。兩個線程都在等待對方先結束。避免死鎖有一個最簡單的原則:若是這個線程可能等待你,那麼你就不要等待這個線程。
一、避免給一個鎖嵌套上鎖
在持有一個鎖的時候,不要再給這個鎖上鎖。若是使用多個鎖,使用std::lock。
二、在持有鎖時,不要調用別人提供的函數
由於你不清楚別人的代碼怎麼實現的,不知道它是否是在使用鎖。
三、給多個鎖上鎖時,固定順序。
若是在給多個所上鎖,而且沒法使用std::lock,最好的作法就是在每個線程中,都按照一樣的順序。
四、分層次來使用鎖
把程序分紅幾個層次。區分每一個層次中使用的鎖,當一個線程已經持有更低層次的鎖時,不容許使用高層次的鎖。能夠在程序運行時給不一樣的鎖加上層次號,記錄每一個線程持有的鎖。