7

簡単なコード(添付)を作成しましたが、一部のブロックのロックがスコープをロックしていない理由がわかりません。

コード :

    object locker = new object();
    private void foo(int i)
    {
        Console.WriteLine( string.Format( "i is {0}", i ) );
        lock( locker )
        {
            while( true )
            {
                Console.WriteLine( string.Format( "i in while loop is {0}", i ) ) ;
                foo( ++i );
            }
        }
    }

whileループでのfooメソッドの呼び出しは、ロッカーが解放されるまで待機することを期待しています(ロッカースコープ)。ただし、引数が++ iのfooのすべての呼び出しは、ロッカーブロックに入ることができます。

4

4 に答える 4

13

ここで使用されるロックは再入可能です。別のスレッドがモニターに入るのを防ぎますが、ロックを保持しているスレッドはブロックされません。

于 2012-04-11T03:42:34.907 に答える
8

Monitor.Enterlockキーワードは、 andMonitor.Exitメソッドの単なる構文糖衣です。のドキュメントに見られるようにMonitor

同じスレッドがブロックせずにEnterを複数回呼び出すことは合法です。

同じスレッドから複数回呼び出しlock(object)ても、ロック数を増やす以外の効果はありません。

于 2012-04-11T03:42:55.653 に答える
1

同じスレッドを使用している場合、ロックは適用されません。http://msdn.microsoft.com/en-us/library/c5kehkcz.aspxを参照してください

于 2012-04-11T03:42:53.767 に答える
1

ここでt1などのスレッドで再帰呼び出しを行うと、別のスレッドがスピンオフされません。再帰呼び出しは同じスレッド t1 で行われています。

t1 はすでにロックを保持しているため、ロックを待つ必要はありません。

于 2012-04-11T04:04:40.023 に答える