避免死锁 - 进程

时间:2013-01-20 13:23:59

标签: c

我想知道如何避免此程序中的死锁

void transfer(int from, into to, double amount) {
     sem_t *sem_from, *sem_to;
     sem_from=get_sem(from); //function that obtains the semaphore from bank account argument
     sem_to=get_sem(to);
     sem_wait(sem_from);
     sem_wait(sem_to);
     withdraw(from, amount); 
     deposit(to, amount); 
     sem_post(sem_to);
     sem_post(sem_from);
}

感谢。

2 个答案:

答案 0 :(得分:1)

您可以通过始终以相同的顺序获取锁定来避免死锁。

由于您的帐号是整数,因此可以自然地锁定它们:首先是最小(或最大)。 (并以相反的顺序发布。)

类似的东西:

if (from < to) {
  sem_one = get_sem(from);
  sem_two = get_sem(to);
} else if (to < from) {
  sem_one = get_sem(to);
  sem_two = get_sem(from);
} else {
  // weird self transfer, deal with it
}
sem_wait(sem_one);
sem_wait(sem_two);
// process transaction
sem_post(sem_two);
sem_post(sem_one);

答案 1 :(得分:0)

你可能以不同的顺序拿锁。假设在线程1中from等于1而to等于2.在线程2 from等于2且to等于1。你有这样的事情:

时间1:线程1:锁定1个线程2:锁定2

时间2:线程1:无法锁定2,线程2:无法锁定1

死锁。