用于伪函数,如
void transaction(Account from, Account to, double amount){
Semaphore lock1, lock2;
lock1 = getLock(from);
lock2 = getLock(to)
wait(lock1);
wait(lock2);
withdraw(from, amount);
deposit(to, amount);
signal(lock2);
signal(lock1);
}
如果您运行事务(A,B,50)事务(B,A,10),则会发生死锁
如何防止这种情况?
这会有用吗?
答案 0 :(得分:5)
处理锁时的简单死锁预防策略是对应用程序中的锁具有严格的顺序,并始终根据此顺序获取锁。假设所有帐户都有一个号码,您可以将逻辑更改为始终首先获取具有最低帐号的帐户的锁定。然后抓住最高编号的锁。
防止死锁的另一个策略是减少锁的数量。在这种情况下,最好使用一个锁来锁定所有帐户。它肯定会使锁结构变得更加简单。如果应用程序在重负载下显示性能问题并且分析显示锁定拥塞是问题 - 那么现在是时候发明一种更细粒度的锁定策略。
答案 1 :(得分:2)
通过使整个交易成为关键部分?这至少只是一种可能的解决方案。
我觉得这是某种功课,因为根据您提供的示例代码,它与the dining philosophers problem非常相似。 (在提供的链接中可以找到问题的多种解决方案,您也知道。如果您想更好地理解这些概念,请查看它们。)