银行情况的僵局问题

Bob*_*ica 3 c# multithreading

我有一个问题,我无法解决这个问题

void Transfer(Account a, Account b, decimal amount) 
{
       lock (a) {
             lock (b) {
                         if (a.Balance < amount)
                         throw new InsufficientFundsExc();
                         a.Balance -= amount;
                         b.Balance += amount;
                         }
                   }
}
Run Code Online (Sandbox Code Playgroud)

问题是"这是银行账户之间的转移."锁定(...)"结构用于对抗竞争条件.这个问题是什么?你提出什么解决方案?你可以帮我吗?

Cod*_*aos 10

如果你在从B转移到A的同时从A转移到B,它可能会死锁,因为你没有锁定命令.

  • 线程1锁定A.
  • 线程2锁定B.
  • 线程1在B上等待
  • 线程2在A上等待

但是为什么这个代码首先是多线程的呢?

您需要始终以相同的顺序获取锁.例如,通过为每个锁提供一个整数Id并始终首先锁定较低的ID.

  • 如果它的功课是自己做的.如果没有作业,但真正的问题就是抛弃多线程.我不会为你做功课. (2认同)
  • 如果没有作业,为什么明天你需要它? (2认同)