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から入手できる。