"CLR LocksAndThreads" 性能计数器实际上是什么意思?

9
我阅读了关于锁和线程性能计数器的文章,但我仍然不理解其中一些计数器的含义。我特别指的是队列长度争用率计数器及其每秒钟的对应计数器。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个回答

8
“队列长度”计数器是指此时正在等待获取锁的线程数量;而“争用率”是过去必须等待一段时间的线程数量。
因此,“队列长度/秒”是队列每秒钟的变化量——上一秒有多少线程变成了等待状态;而“争用率/秒”是上一秒中至少等待了一段时间的线程数量。
这就解释了为什么争用率很高时队列长度可以为0:很多线程只是等待了一点点时间。反之,如果总的争用次数为0但队列很长,那么说明同样的线程已经等待了很长时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接