【问题标题】:Deadlock - Transfer Program [closed]死锁-转移程序[关闭]
【发布时间】:2013-01-20 10:02:14
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 我们不是物理 - 需要更多信息。
  • 很可能是由于获取信号量的顺序。
  • get_sem 是做什么的?

标签: c concurrency


【解决方案1】:

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

【讨论】:

  • 不完全。 from=A 和 to=B 在第一个实例中,from=B 和 to=A 在第二个实例中。所以第一个实例在 A 上获得锁,第二个在 B 上获得锁,它们都在等待。
  • 我怎样才能避免死锁?谢谢。
【解决方案2】:

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

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

【讨论】:

  • 假设 sem_post 正在重置 sem..
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-08
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多