2013-01-20 124 views
0

我想知道我怎么能避免死锁在这个程序避免死锁 - 过程

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

感谢。

+1

http://stackoverflow.com/questions/14423418/deadlock-transfer-program – cnicutar

+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); 
0

你很可能会锁定在不同的顺序。比方说,在线程1 from等于1 to等于2。在线程2 from等于2 to等于1。然后,你有这样的事情:

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

时间2:线程1:不能LOCK2,线程2:不能锁定1个

死锁。