这是一个涉及僵局的模拟银行数据库问题。 我认为,我已经有了答案,但如果这是一个好的解决办法,我会感到奇怪。 提出的问题如下:
你们如何防止以下法典的僵局?
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);
}
如何打破僵局,是用两种途径(或程序)把交易方法与对立账户同时进行,即:
交易(储蓄、检查、1);
交易(检查、储蓄、2);阅读2。
根据我的不理解,我认为正在发生什么,为什么陷入僵局的原因是,由于两条read子都试图走一个锁(相互之间)而没有遵守锁定。
我的迅速和 d忙的解决办法是,将职能交易之外的锁移至它希望这样做的地方。
//somewhere in main
Semaphore lock1, lock2;
lock1 = getLock(from);
lock2 = getLock(to);
wait(lock1);
wait(lock2);
transaction(checking, savings, 2);
signal(lock2);
signal(lock1);
//.....
• 进行交易。
void transaction(Account from, Account to, double amount)
{
withdraw(from, amount);
deposit(to, amount);
}
这样,它们永远不会同时执行,因为交易在技术上是关键部分。 如果是“java”方案,你能否使用监测器,在职能申报中,该词在宣布无效后同步使用? 这一工作吗? 这似乎是一种简单的做法。
我还可能根本不理解这一点,因此感到我可以自由上学,特别是如果我的解释不准确的话。 感谢。