2013-02-20 39 views
7

我有這三種方法的一個類。這個類被許多線程使用。 我想Method1等待,如果Method2和/或Method3在任何線程中運行。 有什麼建議嗎?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可以同時執行嗎?和/或以某種方式暗示。 – 2013-02-20 10:09:45

回答

8

如果我理解正確的,你需要的東西是這樣的:

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

這使方法3至方法2,如果正在運行,反之亦然執行,而方法1必須等待兩個。當然,方法2和3在1運行時不會運行。

+0

@ Grumbler85:是的,謝謝,我錯過了這個方法是靜態的... – 2013-02-20 10:14:27

3

如果你是多線程,那麼lock必須可供所有線程訪問。因此,在這種情況下,您的鎖必須是靜態的才能使靜態方法看到它。

您當前的設置將爲每個線程創建一個新的鎖定對象。因此,現在提供同步。

8

您的鎖的當前實現是完全無用的,因爲每個線程都會鎖定在不同的對象上。
鎖定通常使用只能初始化一次的只讀字段來完成。
這樣,你可以很容易地鎖定多種方法:

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,我不知道這一個:) – 2013-02-20 10:15:40