线程和简单的死锁治愈

PJT*_*PJT 9 c++ synchronization mutex deadlock semaphore

使用互斥锁和信号量处理线程(特别是在C++中)时,有一个简单的经验法则可以避免死锁并具有良好的干净同步效果吗?

Asa*_*aph 16

一个简单的经验法则是始终从应用程序的任何位置以一致的可预测顺序获取锁.例如,如果您的资源具有名称,请始终按字母顺序锁定它们.如果它们具有数字ID,则始终从最低到最高锁定.确切的顺序或标准是任意的.关键是要保持一致.这样你就永远不会遇到僵局.例如.

  1. 线程1锁定资源A.
  2. 线程2锁定资源B.
  3. 线程1等待获得B上的锁定
  4. 线程2等待获得A上的锁定
  5. 僵局

如果您遵循上面概述的经验法则,上述情况永远不会发生.有关更详细的讨论,请参阅关于Dining Philosophers问题Wikipedia条目.


R S*_*hko 7

  1. 如果可能的话,设计你的代码,这样你就不必一次锁定多个互斥锁/信号量.
  2. 如果无法做到这一点,请确保始终以相同的顺序锁定多个互斥锁/信号量.因此,如果代码的一部分锁定互斥锁A然后获取信号量B,请确保代码的其他部分不使用信号量B然后锁定互斥锁A.