乙個簡單的C 死鎖程式

2021-04-21 23:41:51 字數 971 閱讀 8293

jeffrey richter在《windows核心程式設計(第5版)》中描述了乙個死鎖情況:假設執行緒thread1和thread2均需要獨佔方式訪問互斥資源m_res1、m_res2,應用互斥物件monitor在使用前enter(相當於加鎖)、使用後exit(相當於解鎖)。由於涉及到兩個資源,此時需要特別注意加鎖的順序。如果兩個執行緒的加鎖順序不同(thread1先鎖m_res2、thread2先鎖m_res1),此時容易發生死鎖。依據該思路,下面給出了c#實現的完整程式**:

class program

", m_count);

}}

}private static void thread1()

}private static void thread2()}}

執行上述程式時,一般計數到300左右(筆者的機器)就發生死鎖現象了。其原因為:如果thread1鎖住m_res2同時、thread1獲得m_res1的鎖,那麼thread1就不能獲得m_res1的鎖,當然thread2也不能獲得m_res2的鎖。這兩個執行緒都不能繼續下去,於是m_count的值沒有變化。

如果執行緒thread1的加鎖順序與執行緒thread2相同,即:

monitor.enter(m_res1);

monitor.enter(m_res2);

此時,將不會出現死鎖情況。假設thread1鎖住m_res1且申請鎖m_res2,thread2鎖住m_res2並申請m_res1,可以證明不會出現這種情況:因為thread2鎖住m_res2時要麼是先鎖住了m_res1,要麼是釋放m_res1時來不及釋放m_res2。第一種現象不可能,因為thread1鎖住了m_res1;第二種現象是釋放鎖,不存在馬上申請鎖。所以,順序相同時不會出現死鎖情況。

解決的方法還有:使用bool monitor.tryenter()方法,嘗試加鎖並設定乙個時間上界。如果鎖不住,則放棄加鎖,做其他操作。

總結:在多執行緒對多個資源加鎖時,一定要按相同的順序。

乙個簡單的C 死鎖程式

class program m count private static void thread1 private static void thread2 運 行上述程式時,一般計數到300左右 筆者的機器 就發生死鎖現象了。其原因為 如果thread1鎖住m res2同時 thread1獲得 m ...

乙個簡單的死鎖

死鎖 當第乙個執行緒進入第乙個if進入鎖定o1鎖定o2的同步塊,第二個執行緒在外邊等待 當第乙個執行緒出來進入第二個if,第二個執行緒進第乙個if進入o1同步 塊,第乙個執行緒進入第二個if的o2同步 塊,兩個執行緒互相等待彼此釋放鎖,造成死鎖 public class diedlock imple...

乙個簡單的verlig程式 乙個簡單C程式的介紹

我們前面學了c語言的一些理論知識,今天通過乙個簡單的程式先來看一看c語言程式是什麼樣子。然後再對程式中的 進行介紹。這個語句的功能是進行有關的預處理操作。include稱為檔案包含命令,後面尖括號的內容稱為標頭檔案或首檔案。此處指包含stdio.h系統標頭檔案,在下面主函式中使用的printf 函式...