2012-06-09 63 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(); 
}