2010-10-06 65 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。第二个例子以一个固定的顺序获取资源,这使得一个循环和从此以后的死锁成为不可能。