C# 死锁的原理与排查方法详解

01

死锁的原理

     线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,并且互相等待对方释放资源,导致这些线程都处于等待状态,无法继续执行。如果线程都不主动释放所占有的资源,将产生死锁。

如果死锁发生在UI线程,则会导致界面停止响应。

死锁的条件:

1.互斥条件:线程对于所分配到的资源具有排它性,即一个资源只能被一个线程占用,直到被该线程释放

2.请求和保持条件:一个线程因请求被占用资源而发生阻塞时,对已获得的资源保持不放。

3.不剥夺条件:任何一个资源在没被该线程释放之前,任何其他线程都无法对他剥夺占用

4.循环等待条件:当发生死锁时,所等待的线程必定会形成一个环路(类似于死循环),造成永久阻塞

02


死锁示例

e0478e37552150bd2140f3e5be383e49.png

03


如何避免死锁

方法一. 破坏互斥条件

方法二. 破坏环路等待条件

方法三. 破坏不剥夺条件

方法四. 破坏请求和保持条件

采用方法四举例:


f886bf151417bc8cf7b5e0fa5f454afa.png

04


排查方法

step1:在代码调试中,点击暂停按钮,然后vs就会自动定位到

0ffefa9f4fcca57e79820ef90977223f.png

step2:打开并行堆栈:然后点击指定方法名,进一步定位死锁语句

225752184553a9b138453e56cb1bd797.png

05


排查工具

可以采用第三方检测工具LockCop,检测死锁线程号,便于在非调试情况下查询死锁线程号,然后可以结合日志等信息排查死锁原因。

77fb3f2b9f30fd8b1c8d06ab47745b5f.png

技术群: 需要进技术群学习交流的请添加小编微信,切记备注:加群,对U上内容有什么疑问也可以直接和小编直接沟通交流!     

小编微信:mm1552923   

公众号:dotNet编程大全      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之category

CATEGORY_ALTERNATIVE设置这个activity是否可以被认为是用户正在浏览的数据的一个可选择的actionCATEGORY_APP_BROWSER和ACTION_MAIN一起使用,用来启动浏览器应用程序CATEGORY_APP_CALCULATOR和ACTION_MAIN一起使用,用来启动计算器应用程序CATEGORY_APP_…

人生没有对与错,只是选择不同

全世界只有3.14 % 的人关注了爆炸吧知识你用碎片时间学习、赚钱、与时俱进,还是拿来聊天,消遣,刷视频?碎片时间,拉开人生差距,没有对与错,只是选择不同。人生很多地方都有岔路口,很多…

application/x-www-form-urlencoded 与multipart/form-data

为什么上传文件的表单里要加个属性 enctype 上传文件的表单中<form>要加属性enctype"multipart/form-data",很多人只是死记硬背知道上传表单要这么写&#xff0c;知其然而不知其所以然。那到底为什么要添加这个属性呢&#xff1f;它是什么意思呢&#xff1f;它…

学会这些, 让你的服务器远离***影响

介绍:SSH又称Secure Shell, 是linux下常用的远程登陆服务器方式, 其基于SSL加密功能, 相比较ftp, telnet等明文传输协议来说安全等级更高, 在在企业开发环境中被大量使用, 而基于SSH的安全方式鱼龙混杂, 各有春秋. 原因&#xff1a;有一个朋友是做游戏的&#xff0c;他告诉我他…

Android之ActivityManager与Proxy模式的运用

二 Android中ActivityManager 从官方文档的介绍可以看到ActivityManager的作用&#xff1a; 是与系统所有正在运行着的Acitivity进行交互&#xff0c;对系统所有运行中的Activity相关信息&#xff08;Task&#xff0c;Memory&#xff0c;Service&#xff0c;App&#xff09; 进…

服务器文件每天备份重新命名,定时备份服务器文件至本地电脑

你有么有遇到过以下情况&#xff1a;1 写的脚本忘记保存&#xff0c;然后苦逼地再写一遍2 脚本不小心或者小心地删掉了&#xff0c;但后来又发现很有用&#xff0c;依然苦逼地再写一遍3 实验室的服务器炸了&#xff0c;写的脚本全没了一般情况下&#xff0c;第三种情况不会遇到…

河流Shader

原地址&#xff1a;http://www.unity蛮牛.com/blog-2321-336.html Shader "Custom/TextureEffect" {Properties { _MainTint("Diffuse Tint",Color) (1,1,1,1)_MainTex ("Base (RGB)", 2D) "white" {}_ScrollXSpeed("X Scrol…

化学到底有多难难难难!为了让学生搞懂化学,竟然...

▲ 点击查看提到化学&#xff0c;大家脑子里都会想到什么呢&#xff1f;枯燥的化学式&#xff1f;还是难背的元素周期表&#xff1f;还是让人头疼的化学考试题&#xff1f;在由NHK&#xff0c;NHK Educational Corp、西南德国广播&#xff08;SWR&#xff09;、卡塔尔半岛电视台…

面试题--特别是字节对齐

来源&#xff1a;http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html 【1】设置或者清除某位。 示例代码如下: 1 #include<iostream>2 using namespace std;3 4 #define BIT3 (0x1<<3)5 6 void Set_bit3(int &a)7 {8 a|BIT3;9 } 10 11…

配置基于python的VIM环境

配置基于python的VIM环境 安装插件管理工具 为防止过多插件管理的麻烦&#xff0c;首先安装vim的插件管理工具Vundle。vundle本身的github软件已经有相关的中文文档&#xff0c;地址如下&#xff1a; vundle官方中文文档 复制其配置&#xff0c; set nocompatible …

Npgsql 6.0.2 发布,赶紧升级!!!

❝PostgreSQL 是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;是以加州大学计算机系开发的 POSTGRES&#xff0c;4.2版本为基础的对象关系型数据库管理系统。POSTGRES 的许多领先概念只是在比较迟的时候才出现在商业网站数…

Android之中获取应用程序(包)的信息-----PackageManager的使用(一)

转载&#xff1a;http://blog.csdn.net/qinjuning/article/details/6867806 本节内容是如何获取Android系统中应用程序的信息&#xff0c;主要包括packagename、label、icon、占用大小等。具体分为两个 部分&#xff0c;计划如下&#xff1a; 第一部分&#xff1a; 获取应用程…

dnf公共频道服务器不稳定已从初始化状态,DNF公共频道跨区列表 组队连不上必看...

DNF公共频道组队连接不上&#xff1f;在大转移版本之后很多玩家表示DNF公共频道不能组队&#xff0c;实际上这个和大家所在的DNF公共频道跨区有关&#xff0c;位于同一个跨区的玩家之间才能够组队&#xff0c;这里是一份DNF公共频道跨区列表&#xff0c;除此之外还有公共频道的…

JDK中DNS缓存的分析

在JAVA中使用InetAddress.getByName(String host) 方法来获取给定hostname的IP地址。为了减少DNS解析的请求次数&#xff0c;提高解析效率&#xff0c;InetAddress中提供cache来缓存解析结果。 下面就此cache进行简单的分析&#xff1a; 该缓存实现比较简单&#xff0c;巧妙的利…

了解开源文化

开放源码软件运动是计算机科学领域的一种文化现象&#xff0c;源自***对智慧成果共享、自由的追求。开源运动发展到现在&#xff0c;这种能够积极促进人类文明发展的文化已经***到信息、教育、健康等领域&#xff0c;融入了哲学范畴。开放源码运动的史前史包括了整个Unix&#…

jquery验证手机号码和邮箱地址例子

为什么80%的码农都做不了架构师&#xff1f;>>> //jquery验证邮箱 function checkSubmitEmail(){ if($("#email").val()""){ $("#confirmMsg").html("邮箱地址不能为空&#xff01;"); $("#email").focus()…

.NET 6新特性试用 | 可写JSON DOM API

前言我们常用JSON的方式&#xff0c;是将类对象序列化/反序列化:var user new User { Name "My IO" }; var json JsonSerializer.Serialize(user); var newUser JsonSerializer.Deserialize<User>(json);而通过System.Text.Json提供的可写JSON DOM API&…

网页设计的css样式,网页设计引入CSS样式的五种方式_css

一、使用STYLE属性将STYLE属性直接加在个别的元件标签里&#xff0c;&#xff1c;元件(标签) STYLE”性质(属性)1: 设定值1; 性质(属性)2: 设定值2; …}例如&#xff1a;&#xff1c;TD STYLE”COLOR:BLUE; font-size:9pt; font-family:”标楷体”; line-height:150%&#xff1…

C#薪水和前途

这1&#xff0c;2年有更新简历&#xff0c;一直在看市场行情&#xff0c;最近这么多年在聊C#的薪水&#xff0c;我也说说我看到的情况&#xff0c;只限上海&#xff1b; 仅供大家参考&#xff1b; 高端职位&#xff1a; 纯技术&#xff0c;不谈管理&#xff0c; 一般是架构师职…