-1

以下のコードは、クリティカル セクションを形成するために使用されます。

 public class CommonResource
{
    public object obj = new object();

    public void PopularFunction()
    {
        lock (obj)
        {
            ///Access variable that we want to protect form being accessed concurrently 
            ///This forms critical section
            ///My question is what is role'obj' plays in forming critical section.
            ///How it works behind the scene.
        }

        ///Above code can be written as 

        Monitor.Enter(obj);
        ///Access variable that we want to protect form being accessed concurrently 
        ///This forms critical section
        ///My question is what is role'obj' plays in forming critical section.
        ///How it works behind the scene.
        Monitor.Exit(obj);
    }
}

私の質問は、「obj」の助けを借りて、Monitor.Enter がクリティカル セクションをどのように形成するかです。常にオブジェクトを渡す必要がある場合、フレームワークがオブジェクトを明示的に渡すことができないのはなぜですか。間違いなく、これには何らかの理由があるはずです。誰でも説明できますか?

ありがとう、ヘマント

4

2 に答える 2

2

ロックの識別子として使用するオブジェクトを渡しています。次のクラスがあったとします。

public class LockTest
{
    private object obj1 = new object();
    private object obj2 = new object();

    public void Method1()
    {
        lock(obj1)
        {
            ...
        }
    }

    public void Method2()
    {
        lock(obj2)
        {
            ...
        }
    }

    public void Method3()
    {
        lock(obj1)
        {
            ...
        }
    }
}

異なるスレッドから呼び出すMethod1と、別のオブジェクトをロックしているため、どちらの呼び出しも他方をブロックしません。Method2ただし、別のスレッドから呼び出した場合、Method1ブロックMethod3lock(obj1)最後でロックが解放されるまで、最初に実行するスレッドが他のスレッドの実行をブロックします。

于 2013-04-08T12:57:20.240 に答える
1

フレームワークがscopeロックの を認識するために使用されます。

基本的に、静的オブジェクトまたは非静的オブジェクトのいずれかを使用します。

public class Foo
{
    private object sync = new object();
    public void Bar()
    {
        lock (this.sync)
        {
            // You can call new Foo().Bar() multiple times, because
            // each Foo class lock its own instance of the sync object
        }
    }
}

public class Foo
{
    private static object sync = new object();
    public void Bar()
    {
        lock (sync)
        {
            // You can't call new Foo().Bar() multiple times, because
            // each Foo class lock the same instance of the sync object
        }
    }
}
于 2013-04-08T13:00:29.063 に答える