我想知道如何避免此程序中的死锁
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);
}
感谢。
答案 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
死锁。