有關死鎖的討論

        死鎖: 是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。

     產生死鎖的原因:

             1、因爲系統資源不足。
             2進程運行推進的順序不合適。    
             3資源分配不當。

     產生死鎖的條件有四個:
             1互斥條件:所謂互斥就是進程在某一時間內獨佔資源。
             2請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
             3不剝奪條件:進程已獲得資源,在末使用完之前,不能強行剝奪。
             4循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。

      死鎖是因爲多線程訪問共享資源,由於訪問的順序不當所造成的。以多線程爲例,如果線程1擁有了臨界區對象A,等待臨界區對象B的擁有權,線程2擁有了臨界區對象B,等待臨界區對象A的擁有權,這就造成了死鎖。死鎖示例如下:

#include <windows.h>
#include <iostream>

DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);

int index = 0;
int tickets = 100;

CRITICAL_SECTION g_csA;
CRITICAL_SECTION g_csB;

int main()
{
    HANDLE hThread1;
    HANDLE hThread2;
    HANDLE hThread3;
 
    InitializeCriticalSection(&g_csA);
    InitializeCriticalSection(&g_csB);

    //創建線程	
    hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
    hThread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL);
    
    CloseHandle(hThread1);   
    CloseHandle(hThread2);
	 
    Sleep(4000);
    DeleteCriticalSection(&g_csA);
    DeleteCriticalSection(&g_csB);

    system("pause");
    return 0;
}
//線程1的入口函數
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
    while (true)
    {
		EnterCriticalSection(&g_csA);
		Sleep(1);
		EnterCriticalSection(&g_csB);
        if (tickets > 0)
        {
            Sleep(1); 
            std::cout << "thread1 sell ticket :" << tickets-- << std::endl;
	    LeaveCriticalSection(&g_csB);
	    LeaveCriticalSection(&g_csA);
        }
        else
<span style="white-space:pre">	</span>{
	    LeaveCriticalSection(&g_csB);
	    LeaveCriticalSection(&g_csA);
            break;
	}
    }
 
    return 0;
}
//線程2的入口函數
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
    while (true)
    {
	EnterCriticalSection(&g_csB);
	Sleep(1);
	EnterCriticalSection(&g_csA);
        if (tickets > 0)
        {
            Sleep(1);
            std::cout << "thread2 sell ticket :" << tickets-- << std::endl;
            LeaveCriticalSection(&g_csA);
	    LeaveCriticalSection(&g_csB);
        }
	else
	{
            LeaveCriticalSection(&g_csA);
	    LeaveCriticalSection(&g_csB);
            break;
         }
    }
    
    return 0;
}




        預防死鎖的方法

                根據產生死鎖的四個必要條件,只要使其中之一不能成立,死鎖就不會出現。爲此,可以採取下列三種預防措施: 
                1、採用資源靜態分配策略,破壞"部分分配"條件; 
                2、允許進程剝奪使用其他進程佔有的資源,從而破壞"不可剝奪"條件; 
                3、採用資源有序分配法,破壞"環路"條件。

        解除死鎖常常採用下面兩種方法:1、資源剝奪法;2、撤消進程法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章