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

  • 相关阅读:
    从屏幕截取一块区域,将其赋给imageView
    oc 中随机数的用法(arc4random() 、random()、CCRANDOM_0_1()
    UIPopoverController
    IOS-- UIView中的坐标转换
    TCP、UDP的区别
    TCP/IP协议简单介绍
    NSTimer类的使用
    UI基础-网络编程
    IOS面试中的一些问题
    iOS开发UI篇—UITabBarController简单介绍
  • 原文地址:https://www.cnblogs.com/hahanonym/p/13753050.html
Copyright © 2011-2022 走看看