0

I want to know how can I avoid a deadlock in this program

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

Thanks.

4

2 回答 2

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);
于 2013-01-20T13:39:30.533 回答
0

您可能正在以不同的顺序锁定。假设在线程 1from中等于 1 并且to等于 2。在线程 2from中等于 2 并且to等于 1。然后你有这样的东西:

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

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

僵局。

于 2013-01-20T13:44:17.937 回答