Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在实时应用程序中检测死锁的方法_Multithreading_Thread Safety_Deadlock - Fatal编程技术网

Multithreading 在实时应用程序中检测死锁的方法

Multithreading 在实时应用程序中检测死锁的方法,multithreading,thread-safety,deadlock,Multithreading,Thread Safety,Deadlock,在实时多线程应用程序中检测死锁的方法有哪些 如果我们发现存在死锁,有没有办法在不关闭/重新启动应用程序的情况下解决它 有两种常用的方法来检测死锁 一种是让线程设置检查点。例如,如果有一个线程有一个工作循环,则在开始工作时设置一个计时器,设置的时间比您认为的工作可能需要的时间长。如果计时器触发,则假定线程处于死锁状态。当工作完成时,您取消计时器 另一个(有时组合使用)是线程可能会阻止跟踪线程可能持有的其他资源。当其他线程以相反的顺序获取一个锁时,这可以直接检测到试图获取另一个锁的行为 这甚至可以在

在实时多线程应用程序中检测死锁的方法有哪些

  • 如果我们发现存在死锁,有没有办法在不关闭/重新启动应用程序的情况下解决它


  • 有两种常用的方法来检测死锁

    一种是让线程设置检查点。例如,如果有一个线程有一个工作循环,则在开始工作时设置一个计时器,设置的时间比您认为的工作可能需要的时间长。如果计时器触发,则假定线程处于死锁状态。当工作完成时,您取消计时器

    另一个(有时组合使用)是线程可能会阻止跟踪线程可能持有的其他资源。当其他线程以相反的顺序获取一个锁时,这可以直接检测到试图获取另一个锁的行为

    这甚至可以在没有实际发生死锁的情况下检测死锁风险。如果一个线程先获取锁A,然后获取锁B,另一个线程先获取锁B,然后获取锁A,则除非它们重叠,否则不会出现死锁。但是这种方法可以检测到它

    高级死锁检测通常仅在调试期间使用。除了对应用程序进行编码以检查每个阻塞锁是否存在可能的死锁并知道发生死锁时该怎么办之外,死锁发生后唯一可以做的事情就是关闭应用程序。您不能盲目地释放锁,因为它们保护的资源可能处于不一致的状态

    有时,您故意编写可能导致死锁的代码,并专门编写代码以避免出现问题。例如,如果您知道有很多线程使用锁A,然后尝试获取锁B,而其他一些线程需要执行相反的操作,那么您可以将其编码为执行非阻塞尝试以锁定B,并在失败时释放锁A


    通常,将精力花在使死锁不可能发生上比让代码检测并解决死锁更有用。

    Python有一个称为的功能,它对于处理死锁非常有用:

    import faulthandler
    faulthandler.register(signal.SIGUSR1)
    

    如果使用C++或使用GLUBC的编译器,可以使用ExcPif.h中的ButTrace()函数打印StAdTrace,并在获得信号时优雅地退出。您可以获取一个死锁程序,向它发送一个信号,并获取所有线程的列表


    在Java中,在卡住的进程上使用

    java线程转储可以用来检测死锁吗?它可以告诉被阻止的线程,但不确定是否可以检测到死锁。@Amberberberiwal可以工作。使用所有线程堆栈的转储,您可以尝试找出哪个线程是块,试图获取锁,哪个线程持有该锁。如果你有很多线程,这会很乏味,但并非不可能。