2012-06-09 62 views
1

從假設沒有辦法自動增加計數器並鎖定一個互斥量(或ty獲取它)開始,是否有任何多線程庫允許讀取等待線程數一個互斥體?獲取等待聯鎖的線程數

+0

線程等待數一個互斥體通常並不需要知道,因爲不管這個函數返回什麼值,在你對這些信息採取行動的時候它可能是錯誤的/過時的(例如,一個新的線程可能會立即嘗試獲取互斥體你稱之爲函數)。也就是說,一些靜音有一個try_lock()方法,如果它沒有被鎖定,它將鎖定互斥體,否則失敗......這會告訴你互斥體是否被鎖定。 –

+0

@JeremyFriesner這是一種更好的好奇心。我認爲,如果互斥體實際上是一種條件,並且主管線程想知道是否有任何其他線程對這種情況感興趣,它可能會有所幫助。 –

+0

它不叫「庫」,它是「調試器」。唯一可以依賴的軟件凍結所有正在運行的線程,所以結果在納秒內實際上是有意義的並且毫無用處。 –

回答

0

我不知道哪種編程語言,你的編碼,但在C#中,而不會阻塞的對象上可以try to get an exclusive lock,所以你的互斥實現應該是這樣的:

class MyMutex 
{ 
    public int LockedThreadsCount 
    { 
     get { lock (countLock) { return waitingThreads; } } 
    } 

    public void WaitOne() 
    { 
     if (!Monitor.TryEnter(mainLock)) 
     { 
      lock (countLock) { waitingThreads++; } 
      Monitor.Enter(mainLock); 
      lock (countLock) { waitingThreads--; } 
     } 
    } 

    public void Release() 
    { 
     Monitor.Exit(mainLock); 
    } 

    private int waitingThreads = 0; 
    private object countLock = new object(); 
    private object mainLock = new object(); 
}