15

これら 3 つのメソッドを持つ 1 つのクラスがあります。このクラスは多くのスレッドで使用されます。Method2 および/または Method3 がいずれかのスレッドで実行されている場合、Method1 を待機させたいと思います。助言がありますか?

public class Class1
{
    public static void Method1() 
    {
        Object lockThis = new Object();

        lock (lockThis)
        {
            //Body function
        }
    }

    public static void Method2() 
    {
         //Body function
    }

    public static void Method3() 
    {
         //Body function
    }
}
4

4 に答える 4

19

私が正しく理解していれば、次のようなものが必要です。

static object lockMethod2 = new object();
static object lockMethod3 = new object();

public static void Method1() 
{
    lock (lockMethod2)
    lock (lockMethod3)
    {
        //Body function
    }
}

public static void Method2() 
{
    lock (lockMethod2)
    {
        //Body function
    }
}

public static void Method3() 
{
    lock (lockMethod3)
    {
        //Body function
    }
}

これにより、method2 が実行中の場合は method3 を実行でき、その逆も可能ですが、method1 は両方を待機する必要があります。もちろん、メソッド 1 が実行されている間は、メソッド 2 と 3 は実行されません。

于 2013-02-20T10:09:48.757 に答える
14

すべてのスレッドが異なるオブジェクトをロックするため、ロックの現在の実装はまったく役に立ちません。
ロックは通常、一度だけ初期化される読み取り専用フィールドで行われます。
このように、複数のメソッドを簡単にロックできます。

public class Class1
{
    private static readonly object _syncRoot = new object();

    public static void Method1() 
    {
        lock (_syncRoot)
        {
            //Body function
        }
    }

    public static void Method2() 
    {
        lock (_syncRoot)
        {
            //Body function
        }
    }

    public static void Method3() 
    {
        lock (_syncRoot)
        {
            //Body function
        }
    }
}
于 2013-02-20T10:09:51.997 に答える
12

ReaderWriterLockSlimhttp://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx)をお勧めします

読み取り操作と同様に、方法2と方法3は並行して発生する可能性がありますが、方法1(書き込み操作など)はそれらが終了するのを待つ必要があります。これは通常の読み取り/書き込みの同時実行状況ではありませんが、ロジックは似ています。

public class Class1
{
    private ReaderWriterLockSlim methodLock = new ReaderWriterLockSlim();
    public static void Method1() 
    {
        methodLock.EnterWriteLock();
        try
        {
            //Body function
        }
        finally
        {
            methodLock.ExitWriteLock();
        }
    }

    public static void Method2() 
    {
         methodLock.EnterReadLock();
        try
        {
            //Body function
        }
        finally
        {
            methodLock.ExitReadLock();
        }
    }

    public static void Method3() 
    {
         methodLock.EnterReadLock();
        try
        {
            //Body function
        }
        finally
        {
            methodLock.ExitReadLock();
        }
    }
}
于 2013-02-20T10:13:32.543 に答える
3

マルチスレッドの場合は、lockすべてのスレッドがにアクセスできる必要があります。したがって、この場合、静的メソッドがロックを表示するには、ロックが静的である必要があります。

現在の設定では、スレッドごとに新しいロックオブジェクトが作成されます。したがって、同期を提供します。

于 2013-02-20T10:08:50.720 に答える