LoginSignup
8
8

More than 5 years have passed since last update.

排他制御でMonitorを使った実装はやめよう

Last updated at Posted at 2016-08-23

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 の方が実装量が少ないし。

8
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8