1.死鎖檢測
給定一組執行緒操作鎖的流程,判斷是否會發生死鎖?
例如:有兩個執行緒和兩個資源,執行緒對鎖的操作如下:
其中t表示執行緒id,l表示鎖id,s表示操作(1表示獲取鎖,0表示釋放鎖)
t l s
1 1 1(執行緒1獲取1號鎖)
2 2 2(執行緒2獲取2號鎖)
1 2 1(執行緒1獲取2號鎖,保持等待)
2 1 1(執行緒2獲取1號鎖,導致死鎖)
如果最後一次操作換為:2 2 0,就不會死鎖.
問題的關鍵是如何判斷死鎖的發生,以上面的例子為例:執行緒2獲取1號鎖時,發現1號鎖被1號執行緒占用,那麼就要等待執行緒1釋放1號鎖,然後再看執行緒1在等待2號鎖,2號鎖被2號執行緒占用,因此1號執行緒又要等2號執行緒釋放2號鎖,這就形成了乙個等待環:執行緒2->執行緒1->執行緒2,發生死鎖.所以檢測死鎖的方法就是判斷是否存在這種等待的環路.
對於給定的執行緒操作鎖的序列:vector> tls,判斷是否發生死鎖要維護3個map,
map lock2thread:鎖->執行緒,標識當前鎖被哪個執行緒占用
map waitedthread2lock:標識當前執行緒在等待哪個鎖
map> thread2locks:標識執行緒持有的鎖.
偽**如下(省去了一些更新和查詢操作):
bool deadlock(vector> &tls) elseelseelse{//說明lock空閒,直接獲取
更新lock2thread和thread2locks;
2.死鎖預防:銀行家演算法
思路很簡單,只有當資源池中有充足的資源時才將資源分配給程序,否則便認為可能存在死鎖的風險.
一種簡單的死鎖檢測演算法
1.死鎖檢測 給定一組執行緒操作鎖的流程,判斷是否會發生死鎖?例如 有兩個執行緒和兩個資源,執行緒對鎖的操作如下 其中t表示執行緒id,l表示鎖id,s表示操作 1表示獲取鎖,0表示釋放鎖 t l s 1 1 1 執行緒1獲取1號鎖 2 2 2 執行緒2獲取2號鎖 1 2 1 執行緒1獲取2號鎖,保...
死鎖檢測演算法
一 實驗目的 3 二 實驗內容 3 1 資料輸入 3 2 處理要求 3 三 實現思路 4 死鎖檢測機制 4 四 主要的資料結構 4 標頭檔案與巨集定義 4 程序結構體定義 4 初始化函式 4 讀入資料檔案 4 輸出所讀入的資料 4 檢測 5 顯示資訊函式 5 主函式 5 五 演算法流程圖 5 六 執...
mysql 死鎖 MySql 死鎖時的一種解決辦法
之前也遇到一次,今天又遇到了這個問題,所以這次必須解決,網上找到這篇文章幫了大忙,方便以後複習。這篇文章的解決辦法對於我的情況是有效的。我的具體情況是 使用robotframework測試時,本來可以通過的乙個case報錯了,報錯為 internalerror 1205,u lock wait ti...