免费下载案例集|20+数字化领先企业人才培养实践经验 了解详情
写点什么

用 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:172386

评论

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

惊讶!史上最年轻的 Apache Committer 诞生!!!

ApacheStreamPark

Apache 大数据 开源 StreamPark 00后

C# 字符串操作指南:长度、连接、插值、特殊字符和实用方法

小万哥

C# 程序人生 编程语言 软件工程 后端开发

让uniapp小程序支持多色图标icon:iconfont-tools-cli

达摩

uni-app iconfont-tools-cli

低代码技术杂谈

互联网工科生

软件开发 低代码 JNPF

1688商品列表API接口文档

tbapi

1688 1688API接口 1688商品列表数据接口

python开发之远程开发工具对比

不在线第一只蜗牛

Python 开发工具 开发语言

《Java实战(第2版)》PDF

程序员李木子

【深度观点】资源数字化、数字资产化与资产数权化是分布式商业运行的核心要素

Geek_e4ef21

数字化转型 数字资产 数据要素 分布式商业

图文共赏---人工智能时代的由文生图

fliter

思考-RBAC中对于权限编码部分的压缩处理

alexgaoyh

Java rbac 权限设计 压缩算法 权限编码

【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你认识和了解JMM并发模型的基本原理

洛神灬殇

Java JVM 计算机 Java虚拟机 2024年第十六篇文章

解密最受欢迎的开源 Serverless 框架:流量篇

阿里巴巴云原生

阿里云 云原生

5分钟教会你如何在生产环境debug代码

EquatorCoco

前端 bug 生产环境 review

2024-01-20:用go语言,小扣在探索丛林的过程中,无意间发现了传说中“落寞的黄金之都“, 而在这片建筑废墟的地带中,小扣使用探测仪监测到了存在某种带有「祝福」效果的力场, 经过不断的勘测记录,

福大大架构师每日一题

福大大架构师每日一题

低代码开发:数据处理与可视化

EquatorCoco

大数据 软件开发 低代码 数据可视化 数据化

《Java并发实现原理:JDK源码剖析》PDF

程序员李木子

什么是 Redis?它的特点是什么?Redis的数据类型有哪些?Redis的主要应用场景有哪些?

百度搜索:蓝易云

redis 云计算 Linux 运维 云服务器

一步步教你如何搭建K8S集群

不在线第一只蜗牛

Kubernetes 云原生 容器化 K8s 多集群管理

代码之外:工程师的成长进阶秘籍

声网

Java语言之float、double内存存储方式

百度搜索:蓝易云

Java Linux 云服务器 float double

如何搭建一个vue项目

EquatorCoco

Vue 前端 前端框架

5分钟说清楚如何让代码更加整洁

伤感汤姆布利柏

程序员 代码 代码规范 代码阅读 前沿

电商API接口的最佳实践与案例分析

Noah

1688图片搜索API接口丨拍立淘API接口文档

tbapi

1688 以图搜图 1688API 图片搜索API接口 图片搜索接口

Nginx【Nginx核心指令(rewrite指令、实战rewrite 、if指令、set和break指令】

百度搜索:蓝易云

nginx 云计算 运维 Web 云服务器

2023年十款开源测试开发工具推荐(自动化、性能、造数据、流量复制)

快乐非自愿限量之名

开源 测试工具 工具分享

低代码开发平台——JNPF

高端章鱼哥

低代码 JNPF

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