【问题标题】:Is there any low level metric/logging of thread locks in .NET?.NET 中是否有任何低级别的线程锁度量/日志记录?
【发布时间】:2017-05-02 13:00:40
【问题描述】:

多年来,如果它存在,我还没有真正遇到过,所以我把它放在那里是为了了解是否有人知道任何低级 .NET 功能,可能在反射中,可以捕捉到线程已被锁定?也许是某种日志记录?

private object _lockObject = new object();

void MyFunc()
{
  lock(_lockObject) // <== How can I understand how many threads are waiting on this?
  {
    // Do work
  }
}

将某种锁处理程序放在一起并传递一个谓词例如...是否可行?

void DoLock(object lockObject, Action predicate)
{
    push(threadid);
    lock(lockObject)
    {
      pop(threadid);
      predicate();
    }
}

【问题讨论】:

  • 谢谢 MickyD,信号量似乎不符合我想要实现的目标,因为您通常为一个功能设置一个信号量,而我正在寻找了解发生了什么所有锁。除非你有其他想法并且可以提供一个例子?

标签: c# .net multithreading logging locking


【解决方案1】:

您可以通过PerformanceCounter获取一些信息。

为此,您需要知道要监控的进程的名称。

性能计数器类别名称是".NET CLR LocksAndThreads",该类别的计数器名称显示在我上面链接的页面上的表格中。

监控通常从与被监控的进程不同的进程执行,但为简单起见,这里是一个监控自身的示例控制台应用程序:

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main()
        {
            var counter1 = new PerformanceCounter(".NET CLR LocksAndThreads", "Contention Rate / sec",  "ConsoleApp1");
            var counter2 = new PerformanceCounter(".NET CLR LocksAndThreads", "Total # of Contentions", "ConsoleApp1");

            Task.Run(() => test());
            Task.Run(() => test());
            Task.Run(() => test());
            Task.Run(() => test());

            while (true)
            {
                Thread.Sleep(100);
                Console.WriteLine($"Contention: {counter1.NextValue()}/sec, Total: {counter2.NextValue()}");
            }

        }

        static object locker = new object();

        static void test()
        {
            while (true)
            {
                lock (locker)
                {
                    Thread.Sleep(50);
                }
            }
        }
    }
}

【讨论】:

  • 这个解决方案非常适合所有锁的整体情况,我想没有更精细的计数器来理解每个锁,因为 lock() 没有“命名”功能。我必须将 ConsoleApp1 替换为 Process.GetCurrentProcess().ProcessName 才能使其在调试模式下工作。
  • @ajb101 抱歉,据我所知没有。
猜你喜欢
  • 1970-01-01
  • 2019-02-10
  • 2019-06-05
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2011-05-06
相关资源
最近更新 更多