我想知道为什么这个程序会出现死锁
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 :(得分: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);
}