zoukankan      html  css  js  c++  java
  • C# lock 死锁问题排查方法

    多线程程序发生死锁,某些重要线程卡住,不正常工作。排查起来非常麻烦。以下内容记录排查方法

    1.确定死锁的位置,一般死锁会lock到某一行具体的代码,比如我就死锁在类似如下代码中

            public void SendSerialportMsg()
            {
                lock(this) //死锁
                {
                    //..
                }
            }

    具体定位死锁位置的方法:运行模式下,visual studio--调试--窗口--线程,底下栏目会多出一栏线程视图。

    点击程序暂停运行按钮,在打开线程视图,就能看到所有的线程列表。找到你认为发生死锁的那条线程,右键切换到线程,程序就能自动跳转到死锁那一行代码,如下类似

     2、已经找到死锁位置了,首先如果比较简单,先人工review一下,看看能不能找到死锁问题

    3、如果不能简单解决。那可以尝试,给可能产生死锁的线程加上线程名,便于辨认。然后,修改死锁位置代码如下

            Thread lastThread=null;
            public void SendSerialportMsg()
            {
                lastThread = Thread.CurrentThread;
                lock (this)  //死锁位置
                {
                    lastThread = Thread.CurrentThread;
                    //..
                }
            }

    4、再重现一次死锁。定位到死锁行,然后展开lastThread,看该线程运行在那里卡住,以致于后续线程不能响应。然后排查lastThread的阻塞问题。Done!!!

  • 相关阅读:
    16061109-第0次个人作业
    面向对象第四次总结
    面向对象5-7次作业总结
    2018 OO第一次总结(作业1-3)
    (最终作业)面向对象先导课课程总结
    HTML学习笔记
    实验八 进程间通信
    信号
    进程基础
    shell脚本编程
  • 原文地址:https://www.cnblogs.com/hahanonym/p/13753050.html
Copyright © 2011-2022 走看看