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

谢谢。

4

3 回答 3

2

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

于 2013-01-20T10:09:39.663 回答
1

据我了解,如果一个函数的多个实例正在运行,那么如果任何函数(提款,存款)未能重置信号量,那么其他函数将停止工作,因为它们无法获取信号量。

如果功能保证完成,则可以避免死锁。

于 2013-01-20T10:15:51.667 回答
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);
}
于 2013-01-20T10:27:21.100 回答