BT

NETのデッドロックを検出するPostSharp

| 作者: Jonathan Allen フォローする 530 人のフォロワー , 翻訳者 徳武 聡 フォローする 0 人のフォロワー 投稿日 2012年9月12日. 推定読書時間: 2 分 |

原文(投稿日:2012/09/10)へのリンク

 

SharpCraftersのAOPフレームワークの開発元であるPostSharpは、デッドロック検出ツールを開発した。このツールはMutex、Monitor、ReaderWriterLockのような一般的なロックプリミティブを用いて、単一の行をプロジェクトに追加するだけで利用できる。

スレッドが200ミリ秒以上ロック解放を待つと、ツールはデッドロック検出ルーチンを実行します。デッドロックを検出すれば、デッドロックに関連しているすべてのスレッドでDeadlockExceptionをスローします。この例外にはデッドロックに関連するすべてのスレッドの詳細な情報を保持するので、分析して問題解消に役立てることができます。

デッドロック検出は難しくはないが、アプリケーション全体に政客に適用するために大量の定型的なコードを書かなければならない。PostSharp Threading ToolkitはILの書き換え技術を使い、lockステートメントの周囲に自動的にこのようなコードを注入する。

このツールは誤った検出を避けるためにかなり保守的なロジックの書き方になっているはずだ。デッドロックを検出しないよりも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は2条項BSDライセンスで公開されている。GitHubから入手できる

 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT