jeffrey richter在《windows核心程式設計(第5版)》中描述了乙個死鎖情況:假設執行緒thread1和thread2均需要獨佔方式訪問互斥資源m_res1、m_res2,應用互斥物件monitor在使用前enter(相當於加鎖)、使用後exit(相當於解鎖)。由於涉及到兩個資源,此時需要特別注意加鎖的順序。如果兩個執行緒的加鎖順序不同(thread1先鎖m_res2、thread2先鎖m_res1),此時容易發生死鎖。依據該思路,下面給出了c#實現的完整程式**:
class program執行上述程式時,一般計數到300左右(筆者的機器)就發生死鎖現象了。其原因為:如果thread1鎖住m_res2同時、thread1獲得m_res1的鎖,那麼thread1就不能獲得m_res1的鎖,當然thread2也不能獲得m_res2的鎖。這兩個執行緒都不能繼續下去,於是m_count的值沒有變化。", m_count);
}}
}private static void thread1()
}private static void thread2()
}}
如果執行緒thread1的加鎖順序與執行緒thread2相同,即:
monitor.enter(m_res1);此時,將不會出現死鎖情況。因為不管哪個執行緒鎖住m_res1,另乙個執行緒就不能對m_res1加鎖,當然也就不能對m_res2加鎖。於是,第乙個鎖住m_res1的執行緒就可以從容得鎖住m_res2,在完成執行緒的相關工作後釋放兩個鎖。解決的方法還有:使用bool monitor.tryenter()方法,嘗試加鎖並設定乙個時間上界。如果鎖不住,則放棄加鎖,做其他操作。monitor.enter(m_res2);
程式死鎖原因
交叉鎖可導致程式出現死鎖 執行緒a持有r1的鎖等待r2的鎖,同時執行緒b持有r2的鎖等待r1的鎖,這種情況最容易導致死鎖的產生記憶體不足 當併發請求系統可用記憶體時,如果此時系統記憶體不足,則可能會出現死鎖。例如 兩個執行緒t1和t2,執行某個任務,其中t1已經獲取了10mb記憶體,t2獲取了20m...
乙個簡單的C 死鎖程式
jeffrey richter在 windows核心程式設計 第5版 中描述了乙個死鎖情況 假設執行緒thread1和thread2均需要獨佔方式訪問互斥資源m res1 m res2,應用互斥物件monitor在使用前enter 相當於加鎖 使用後exit 相當於解鎖 由於涉及到兩個資源,此時需要...
乙個簡單的C 死鎖程式
class program m count private static void thread1 private static void thread2 運 行上述程式時,一般計數到300左右 筆者的機器 就發生死鎖現象了。其原因為 如果thread1鎖住m res2同時 thread1獲得 m ...