具有潜在死锁的代码

时间:2010-10-06 13:55:00

标签: operating-system deadlock

// 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);
 }

然后没有死锁。

为什么会这样?

2 个答案:

答案 0 :(得分:3)

想象一下,进程A正在运行并尝试获取resource_1并获取它。

现在,进程B获得控制权并尝试获取resource_2。得到它。现在,进程B尝试获取resource_1并且没有获取它,因为它属于资源A.然后,进程B进入休眠状态。

进程A再次获得控制并尝试获取resource_2,但它属于进程B.现在他也进入了睡眠状态。

此时,进程A正在等待resource_2,进程B正在等待resource_1。

如果更改订单,进程B将永远不会锁定resource_2,除非它首先获得resource_1,对于进程A则相同。

他们永远不会死锁。

答案 1 :(得分:0)

死锁的必要条件是资源获取的循环。第一个例子构建了这个循环1-> 2-> 1。第二个示例以固定顺序获取资源,这使得循环成为一个循环,从而不可能出现死锁。