siv*_*iva 3 debugging multithreading operating-system deadlock
进程有大约10个线程,所有10个线程都进入DEADLOCK状态(假设所有线程都在等待Mutex变量).
如何从DEADLOCK状态释放进程(线程)?.有没有办法杀死优先级较低的线程?(在多进程的情况下,当所有进程都处于死锁状态时,我们可以杀死优先级较低的进程).
我们可以将该死锁进程附加到调试器并为Mutex变量分配适当的值(假设所有线程都在等待互斥变量MUT,但它的值是0,我们可以通过调试器将MUT值分配给1).
如果应用程序中的每个线程都在等待所有其他线程,并且没有一个线程设置为超时,那么你就会被搞砸了.您可能能够在调试器或其他东西中运行应用程序,但通常会出于某种原因获取锁定 - 并且手动强制互斥锁由不合法获取它的线程拥有可能会导致一些大问题(该线程)以前拥有它仍然会尝试释放它,如果互斥锁被意外地拉走,其结果可能是不可预测的.可能导致意外异常,可能导致互斥锁在仍在使用时被解锁.)无论如何它失败了互斥体的整个目的,所以你只是掩盖了一个更大的问题.
有两种常见的解决方案:
而不是让线程永远等待,设置超时.在像Java这样的语言中,通过synchronized或lock阻塞将互斥体嵌入语言中稍微有些困难,但它几乎总是可行的.如果您等待锁定时间超时,请释放所有锁定/互斥锁,然后再尝试.
更好,但可能更复杂的是弄清楚为什么一切都在争夺资源并消除这种争论.如果必须锁定,请始终锁定.但是如果在一个互斥锁上有10个线程被阻塞,那么这可能是你的操作被严重分块的线索(即:你的线程在尝试获取锁之前一次做太多或太少),或者没有必要锁定继续.除非必须,否则不要锁定.通过使用专门设计为"无锁"但仍提供线程安全性的集合和算法,可以避免某些同步.
| 归档时间: |
|
| 查看次数: |
1323 次 |
| 最近记录: |