2010-10-06 36 views
0
// down = acquire the resource 
// up = release the resource 

typedef int semaphore; 
    semaphore resource_1; 
    semaphore resource_2; 


void process_A(void) { 
    down(&resource_1); 
    down(&resource_2); 
    use_both_resources(); 
    up(&resource_2); 
    up(&resource_1); 
} 

void process_B(void) { 
    down(&resource_2); 
    down(&resource_1); 
    use_both_resources(); 
    up(&resource_1); 
    up(&resource_2); 
} 

爲什麼此代碼會導致死鎖?具有潛在死鎖的代碼

如果我們改變的process_B的代碼,其中兩種方法中以相同的順序要求的資源:

void process_B(void) { 
    down(&resource_1); 
    down(&resource_2); 
    use_both_resources(); 
    up(&resource_2); 
    up(&resource_1); 
} 

那就沒有僵局。

爲什麼這麼說?

回答

3

想象一下,進程A正在運行並嘗試獲取resource_1並獲取它。

現在,進程B控制並嘗試獲取resource_2。並得到它。現在,進程B試圖獲取資源_1並且沒有得到它,因爲它屬於資源A.然後,進程B進入休眠狀態。

進程A再次獲取控制權並嘗試獲取resource_2,但它屬於進程B.現在他也進入睡眠狀態。

此時,進程A正在等待resource_2,進程B正在等待resource_1。

如果更改順序,進程B將永遠除非得到resource_1首先鎖定resource_2,同樣的過程A.

,他們將永遠不會死鎖定。

0

死鎖的一個必要條件是資源獲取的一個週期。第一個例子構造了這個循環1-> 2-> 1。第二個例子以一個固定的順序獲取資源,這使得一個循環和從此以後的死鎖成爲不可能。