“CLR LocksAndThreads”性能计数器实际意味着什么

时间:2011-02-14 08:05:14

标签: .net multithreading performancecounter

我读到了lock and thread performance counters,但我仍然不明白其中有些是什么意思。我特别谈论队列长度争用率计数器及其每秒对应的计数器。 MSDN表示首先显示等待锁定的线程数,第二个显示获取锁定“未成功”的线程数。我以为如果一个线程正在等待一个锁,这意味着没有获得锁,但显然我错了?

假设我有这个示例程序:

static void Main(string[] args)
{
    var t1 = new Thread(RunThread1);
    var t2 = new Thread(RunThread2);
    t1.Start();
    t2.Start();
    t1.Join();
    t2.Join();
}

static void RunThread1()
{
    Thread.Sleep(1000);
    // this lock is acquired immediately. What will counters show at this moment?
    // probably both will be zero?
    lock (m_Lock)
    {
        Thread.Sleep(10000);
    }
}

static void RunThread2()
{
    Thread.Sleep(2000);
    // this lock has to wait for about 9 seconds. What will counters show?
    lock (m_Lock)
    {
        Thread.Sleep(10000);
    }
}

计数器在运行时会显示什么?

1 个答案:

答案 0 :(得分:5)

“队列长度”计数器用于此时等待获取锁的线程数;而“争用率”是过去某个时候必须等待的线程数。

因此,“队列长度/秒”是每秒队列的变化 - 在最后一秒内等待多少线程;和“争用率/秒”是指在最后一秒内等待至少一段时间的线程数。

这解释了当争用率很高时队列长度如何为0:许多线程等待一点时间。反之亦然,0表示争用的总数,但是队列很长:相同的线程等待很长时间。