一種簡單的死鎖檢測演算法

2022-07-30 02:27:11 字數 823 閱讀 8577

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,

maplock2thread:鎖->執行緒,標識當前鎖被哪個執行緒占用

mapwaitedthread2lock:標識當前執行緒在等待哪個鎖

map> thread2locks:標識執行緒持有的鎖.

偽**如下(省去了一些更新和查詢操作):

bool deadlock(vectorint>> &tls)  else

else}}

else

}}}

2.死鎖預防:銀行家演算法

思路很簡單,只有當資源池中有充足的資源時才將資源分配給程序,否則便認為可能存在死鎖的風險.

具體可參考這篇簡單明瞭的文章:

mysql死鎖檢測演算法 一種簡單的死鎖檢測演算法

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...