2013-02-20 3 views
7

私はこれらの3つの方法で1つのクラスを持っています。このクラスは多くのスレッドで使用されます。 Method2および/またはMethod3が任意のスレッドで実行されている場合は、Method1が待機するようにします。 提案がありますか?メソッドロックin c#

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 
    } 
} 
+1

方法2と方法3は同時に実行できますか?それは、ある意味でそれを意味します。 –

答えて

8

私が正しく理解している場合、あなたはこのようなものが必要です。method1には、両方のを待たなければならないが

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 
    } 
} 

をこれは、方法2を実行し、その逆されている場合法3を実行することができます。もちろん、method2と3は、1が実行されている間は実行されません。

+0

@ Grumbler85:はい、ありがとう、私はメソッドが静的だったという事実を逃していました... –

3

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

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

8

すべてのスレッドは異なるオブジェクトでロックされるため、現在のロックの実装は完全に無用です。
ロックは、通常、一度だけ初期化されるreadonlyフィールドで行われます。
このよう 、あなたは簡単に複数のメソッドをロックすることができます。

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 
     } 
    } 
} 
6

は私が示唆している読み取り操作と同様に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 
     { 
      cacheLock.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(); 
     } 
    } 
} 
+0

+1、私はこれを知らなかった:) –