BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

用PostSharp对.NET做死锁检测

| 作者 Jonathan Allen 关注 594 他的粉丝 ,译者 区志为 关注 0 他的粉丝 发布于 2012年9月27日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT