防止死锁

And*_*ung 2 deadlock pseudocode

对于伪函数,如

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);
}
Run Code Online (Sandbox Code Playgroud)

如果您运行事务(A,B,50)事务(B,A,10),则会发生死锁

怎么能防止这种情况?

这会有用吗?

And*_*bel 5

处理锁时,一个简单的死锁预防策略是对应用程序中的锁具有严格的顺序,并始终根据此顺序获取锁.假设所有帐户都有一个号码,您可以将逻辑更改为始终首先获取具有最低帐号的帐户的锁定.然后抓住最高编号的锁.

防止死锁的另一个策略是减少锁的数量.在这种情况下,最好有一个锁定所有帐户的锁.它肯定会使锁结构变得更加简单.如果应用程序在重负载下显示性能问题并且分析显示锁定拥塞是问题 - 那么现在是时候发明一种更细粒度的锁定策略.

  • 是的,问题中更新的代码可以从死锁的角度出发.您不会同时持有两个锁.对于存款/取款,通常也必须具有*原子性*,这需要两个锁定. (2认同)