写点什么

用 PostSharp 对.NET 做死锁检测

  • 2012-09-25
  • 本文字数:824 字

    阅读完需:约 3 分钟

AOP 框架 PostSharp 的开发公司 SharpCrafters 开发了一款即插即用的死锁检测工具包。只要在项目中增加一行代码,这个工具包就可以对 Mutex、Monitor、ReaderWriterLock 等大部分标准的基本锁机制进行死锁检测。

当线程等待锁超过 200 毫秒,工具包将执行一道死锁检测例程。如果检测到死锁,它会向受该死锁影响的所有线程扔出 DeadlockException。异常中详细报告了所有受影响的线程和锁,供用户分析并修复问题。

死锁检测本身并不十分困难,但需要将大量的刻板代码细致地插入到程序的各个部位。 PostSharp Threading Toolkit 使用 IL 重写技术自动地注入这些代码到锁语句周围。

有几点需要注意。PostSharp 用了十分保守的逻辑去防止误报;他们认为错误地扔出一个 DeadlockException 比一个没有被检测到的死锁更糟糕。而且,它不能用于非对称锁,例如 ManualResetEvent,、AutoResetEvent,、Semaphore 和 Barrier,因为“并不清楚哪个线程负责‘发信号’或‘释放’同步资源”。

它能处理的锁包括:

  • Mutex:WaitOne、WaitAll、Release
  • Monitor:Enter、Exit、TryEnter、TryExit(包括 C#关键字 lock;不支持 Pulse 和 Wait 方法)
  • ReaderWriterLock:AcquireReaderLock、AcquireWriterLock、ReleaseReaderLock、ReleaseWriterLock、UpgradeToWriterLock、DowngradeToReaderLock(不支持 ReleaseLock、RestoreLock)
  • ReaderWriterLockSlim:EnterReadLock、TryEnterReadLock、EnterUpgradeableReadLock、TryEnterUpgradeableReadLock、EnterWriteLock、TryEnterWriteLock、ExitReadLock、ExitUpgradeableReadLock、ExitWriteLock
  • Thread:Join

PostSharp Threading Toolkit 以 BSD 2-Clause 协议发布于 GitHub

查看英文原文 http://www.infoq.com/news/2012/09/PostSharp-Deadlock


感谢郭晓刚对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-09-25 23:172415

评论

发布
暂无评论
发现更多内容

MFC|双缓存绘图机制

中国好公民st

c++ qt 10月月更

大数据ELK(十二):Elasticsearch编程(环境准备)

Lansonli

ES 10月月更

你是怎样解决跨域问题的?-面试必问

loveX001

JavaScript

React循环DOM时为什么需要添加key

beifeng1996

React

Angular 内容投影出现 No provider for TemplateRef found 错误的单步调试

汪子熙

typescript Web 前端开发 angular 10月月更

vue面试之Composition-API响应式包装对象原理

bb_xiaxia1998

Vue

数据产品经理实战-项目管理

第519区

项目管理 数据产品经理

【深度讲解系列】SpringBoot入门

Geek_65222d

10月月更

2022-10-03:给定一个正数n,比如6 表示数轴上有 0,1,2,3,4,5,6 <0 或者 >6 的位置认为无法到达 给定两个数字x和y,0<= x,y <= n 表示小人一开始在x的位置,它

福大大架构师每日一题

算法 rust 福大大

从输入URL到渲染的过程中到底发生了什么?

loveX001

JavaScript

React的useLayoutEffect和useEffect执行时机有什么不同

beifeng1996

React

【愚公系列】2022年10月 Go教学课程 017-分支结构之IF

愚公搬代码

10月月更

分享Go书籍-《Go Web编程》

沙漠尽头的狼

微服务标准化

穿过生命散发芬芳

微服务 10月月更

【LeetCode】使括号有效的最少添加Java题解

Albert

LeetCode 10月月更

【SSM】SpringMVC系列——SpringMVC概述

胖虎不秃头

spring ssm 10月月更

vue为什么v-for的优先级比v-if的高?

bb_xiaxia1998

Vue

Vue.$nextTick的原理是什么-vue面试进阶

bb_xiaxia1998

Vue

【SSM】Spring系列——AOP面向切面编程

胖虎不秃头

spring ssm 10月月更

【SSM】Spring系列——Spring集成MyBatis

胖虎不秃头

spring ssm 10月月更

2022前端培训学习过程中需要掌握哪些技术点?

小谷哥

【一Go到底】第三天---变量的使用

指剑

Go golang 10月月更

网络爬虫与http+ssl(1)

张立梵

Python. 爬虫必备知识讲解 10月月更

Goland嗖嗖的: 快捷键,自动生成代码等效率小技巧

琦彦

Go goland 10月月更 live template

Collections之Arraylist源码解读(四)

知识浅谈

ArrayList 10月月更

同事嫌我改Bug慢,原来是没掌握这些代码Debug技巧

慕枫技术笔记

debug 后端 10月月更

Java线上惨痛踩坑记录,你也一定遇到过

一灯架构

Java java面试 10月月更

存储优化--查询分离

喵叔

10月月更

架构师的十八般武艺

agnostic

构架师

基于kube-scheduler-simulator编写自己的调度程序

琦彦

k8s 调度 kube-scheduler 10月月更

Docker下的Nacos环境开发

程序员欣宸

Docker nacos spring cloud alibaba 10月月更

用PostSharp对.NET做死锁检测_.NET_Jonathan Allen_InfoQ精选文章