【问题标题】:Why would unlocking two locked bank accounts in a different order result in a deadlock?为什么以不同的顺序解锁两个锁定的银行账户会导致死锁?
【发布时间】:2019-02-17 18:26:11
【问题描述】:

https://stackoverflow.com/a/51890291/462608

如果我修改银行账户而不锁定它,其他人可能会同时尝试修改它。这是一场竞赛,结果将是未定义的行为(通常是丢失或魔法创造的金钱)。

转账时,我正在修改 2 个银行账户。所以他们都需要被锁定。

问题是,当锁定多个事物时,每个 locker 必须以相同的顺序锁定和解锁,否则就会出现死锁。

示例:从账户 A 提款并存入账户 B。

所以,我先锁A再锁B。那么如果我解锁B再解锁A,为什么会导致死锁呢?

请解释一下。

【问题讨论】:

  • 不想刻薄,但是duckduckgo'ing“互斥死锁”的第一个结果有一个例子和解释。我敢肯定 google 或 bing 或任何其他搜索引擎都是一样的......
  • @Shawn 我会阅读你所指的内容。我知道生产者消费者类型问题中的死锁,但不知道银行账户中的死锁。
  • 呃,你用互斥锁锁定什么并不重要。你可以用任何东西作为例子。重要的是您如何进行锁定。

标签: multithreading thread-safety mutex deadlock


【解决方案1】:

因为你可以满足以下顺序:

  • 线程 1 锁定 A。
  • 线程 2 锁定 B.
  • 线程 1 尝试锁定 B 并阻塞。
  • 线程 2 尝试锁定 A 并阻塞。

两个线程都在等待对方,所以你有一个死锁。

为避免这种情况,您必须始终以相同的顺序获取锁。解锁顺序无关紧要。

【讨论】:

  • 我不确定 SO 上的问题是否有重复项 - 我没能很好地解决这个问题,但 SO 搜索是要处理的 PITA。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多