【问题标题】:Avoid deadlocks in a multithreaded process避免多线程进程中的死锁
【发布时间】:2009-06-25 13:28:30
【问题描述】:

为了避免死锁,人们应该遵循哪些最佳做法/惯用语?

【问题讨论】:

标签: multithreading deadlock idioms


【解决方案1】:
【解决方案2】:

four conditions 必须发生死锁:

  1. 互斥条件:一次不能被多个进程使用的资源

  2. 持有和等待条件:已经持有资源的进程可能会请求新资源

  3. 无抢占条件:不能从持有它的进程中强制移除资源,只能通过进程的显式动作释放资源

  4. 循环等待条件:两个或多个进程形成一个循环链,每个进程等待链中下一个进程持有的资源

至少避免其中一种,最好是更多,这样你就不会遇到太多问题。

【讨论】:

    【解决方案3】:

    有所谓的Banker's algorithm,用于避免死锁。您也可以考虑使用Watch Dog 来打破表单死锁。 Here 也有一些有趣的地方。

    【讨论】:

      【解决方案4】:

      避免死锁的典型技术是有一个锁层次结构。确保所有线程以相同的顺序获取锁或其他资源。这避免了线程 1 持有锁 A 并需要锁 B 而线程 2 持有锁 B 并需要锁 A 的死锁情况。对于锁层次结构,两个线程必须以相同的顺序获取锁(例如,A 在 B 之前) .

      【讨论】:

        【解决方案5】:

        最佳做法是为您的线程定义一个类,并在您的线程中仅使用此类中的非静态字段,这样您的线程就不会共享任何内存。
        当然,为了避免死锁,您也可以避免使用信号量、临界区和互斥锁。越少越好,如果你想避免死锁。不幸的是,如果两个线程之间共享一些内存或其他资源,则需要这些资源,否则您可能会损坏数据。

        【讨论】:

          【解决方案6】:

          在进入临界区的各种方法中——信号量和互斥锁是最流行的。

          • 信号量是一种等待机制,互斥量是一种锁定机制,这个概念最容易混淆,但简而言之,激活互斥量的线程只能停用它。考虑到这一点...

          • 不允许任何进程锁定部分资源,如果一个进程需要 5 个资源,则等到所有资源都可用。

          • 如果你在这里使用信号量,你可以解除阻塞/解除等待其他线程占用的资源。我的意思是先发制人是另一个原因。

          我说的这2个是基本情况,常见的4个注意事项中剩下的2个可以和这些有关。

          如果你不同意 ps 添加 cmets。 gtg 已经晚了,后面我会添加更清晰更清晰的解释。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-08
            • 2021-08-02
            • 2014-06-29
            • 1970-01-01
            相关资源
            最近更新 更多