multithreading - 多线程编程中是否可以恢复死锁?

标签 multithreading debugging operating-system deadlock

进程有大约 10 个线程,所有 10 个线程都进入死锁状态(假设所有线程都在等待互斥变量)。

如何从 DEADLOCK 状态释放进程(线程)? .
有没有办法杀死低优先级线程?(在多进程情况下,当所有进程处于死锁状态时,我们可以杀死低优先级进程)。

我们能否将该死锁进程附加到调试器并为 Mutex 变量分配适当的值(假设所有线程都在等待互斥体变量 MUT 但它的值为 0,我们能否通过调试器将 MUT 值分配为 1)。

最佳答案

如果应用程序中的每个线程都在互相等待,而没有一个线程被设置为超时,那么你就搞砸了。您可能能够在调试器或其他东西中运行该应用程序,但通常会出于某种原因获取锁 - 手动强制互斥锁由未合法获取它的线程拥有可能会导致一些大问题(线程之前拥有的它仍然会尝试释放它,如果互斥锁被意外拉走,其结果可能是不可预测的。可能导致意外异常,可能导致互斥锁在仍在使用时被解锁。)无论如何,它失败了互斥锁的全部目的,所以你只是掩盖了一个更大的问题。

有两种常见的解决方案:

  • 与其让线程永远等待,不如设置一个超时。在像 Java 这样的语言中,通过 synchronized 将互斥锁嵌入到语言中,这有点困难。或 lock块,但它几乎总是可能的。如果您等待锁定超时,请释放您拥有的所有锁定/互斥锁,稍后再试。
  • 更好但可能更复杂的是弄清楚为什么一切都在争夺资源并消除这种争用。如果必须锁定,请始终锁定。但是,如果有 10 个线程阻塞在一个互斥锁上,这可能表明您的操作被严重分块(即:您的线程在尝试获取锁之前一次做的太多或太少),或者是不必要的锁定正在进行中。除非必须,否则不要锁定。通过使用专门设计为“无锁”同时仍提供线程安全性的集合和算法,可以避免某些同步。
  • 关于multithreading - 多线程编程中是否可以恢复死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3850995/

    相关文章:

    debugging - Debug模式: MACDOC;TRDEBG USAGE

    java - Phaser 类别和分层

    windows - CSingleLock 实现在 Windows 7 上工作正常,但在 Win XP 上以死锁结束

    android - 是什么导致了 Android 中的 MotionEvent.ACTION_CANCEL?

    Android,我可以根据自己的喜好操作操作系统吗?

    node.js - 从nodejs访问O_RDONLY,O_WRONLY,...

    multithreading - 单核处理器的多线程代码和多核处理器的单线程代码

    .net - ThreadPool.QueueUserWorkItem 完成事件?

    java - 确保 Spring 组件中线程安全的最高效方法是什么?

    debugging - 开始学习Windbg