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!!!

  • 相关阅读:
    资料存储
    Django学习
    爬虫学习
    time()模块
    一些功能性小程序段
    装饰器
    函数的知识点(理解难点剖析)
    linux中的回收站机制,防止rm -rf 事件
    python--列表解析式 -- 知识整理
    python- 时间模块 datatime 知识整理
  • 原文地址:https://www.cnblogs.com/hahanonym/p/13753050.html
Copyright © 2011-2022 走看看