死锁 - 转移计划

时间:2013-01-20 10:02:14

标签: c concurrency

我想知道为什么这个程序会出现死锁

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

感谢。

3 个答案:

答案 0 :(得分:2)

假设该函数有两个并发运行的实例。第一个是将一些金额从账户A转移到账户B,而第二个是将一些其他金额从账户B转移到账户A.如果发生第一个实例获得A的锁定,同时第二个实例获得B的锁定,发生了死锁。

答案 1 :(得分:1)

据我所知,如果函数的多个实例正在运行,那么如果任何函数(撤销,存款)无法重置信号量,那么其他函数将停止工作,因为它们无法获得信号量。

如果函数保证完成,则可以避免死锁。

答案 2 :(得分:1)

我最初没有注意到每个帐户有一个sem - 而AraK应该得到接受的答案。

只是一个建议:如果撤销存款功能并不昂贵,只需使用定义关键部分的唯一信号量来执行任何传输。在给定时间内只会发生一次转移。

sem_t *sem_tranfer; // to be created and initialized somewhere

void transfer(int from, into to, double amount) {
     sem_wait(sem_transfer);
     withdraw(from, amount); 
     deposit(to, amount); 
     sem_post(sem_transfer);
}