Monitor.Enter を使った排他制御の問題
とあるプロジェクトで、Monitor を使った排他制御の実装がありました。
Monitor.Enter(syncobj);
try
{
//クリティカルセクション
}
finally
{
Monitor.Exit(syncobj);
}
しかし、Monitor.Enter が実行された直後にスレッドが Abort されると try ~ finally に到達していないので Monitor.Exit が呼ばれないためデッドロックを起こします。
.NET4.0 より前に潜む問題
実は lock を使った排他実装は、コンパイルされると .NET4.0 より前は上記の Monitor を使ったコードに変換されていました。
lock (syncobj)
{
//クリティカルセクション
}
.NET4.0 以降は次の用に変換されるように変更されているそうです。
try
{
bool flg = false;
Monitor.Enter(syncobj, ref flg);
//クリティカルセクション
}
finally
{
if(flg) Monitor.Exit(syncobj);
}
.NET4.0 以降であれば Monitor より lock を使いましょう
lock ではなく Monitor を使って実装するのは趣味の選択かと思いますが、 lock の方が実装量が少ないし。