怎样避免死锁?

  • 避免嵌套锁
    一个线程以获得一个锁时,别再去获取第二个。当需要获取多个锁时,使用一个std::lock来对获取锁的操作上锁,避免产生死锁
  • 避免在持有锁时调用用户的代码
    假设在持有锁的情况下,调用用户提供的代码,如果用户代码再去获取一个锁,就会造成死锁。
  • 使用固定的顺序获取锁
    当硬性条件要求获取两个以上(包括两个)的锁,并且不能使用 std::lock 单独操作来获取它们,那么最好在每个线程上,用固定的顺序获取它们(锁),比如一个线程必须先锁住A才能获取B的锁,在锁住B后才能获取C的锁。
  • 使用锁的层次结构
    对应用进行分层,并且识别在给定层上所有可上锁的互斥量,当代码试图对一个互斥量上锁,在该层锁已被底层持有时,上锁是不允许的,可以在运行时对其进行检查,通过分配层数到每个互斥量上,以及记录被每个线程上锁的互斥量,
打赏作者