Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#lock(),以获取度量?_C#_Multithreading - Fatal编程技术网

C#lock(),以获取度量?

C#lock(),以获取度量?,c#,multithreading,C#,Multithreading,我在应用程序中使用C#lock()来确保没有两个或多个线程同时执行同一代码块。lock()是在我发生碰撞后添加的,因此我知道这是可能的,并且会发生不好的事情 现在我正试图找出如何获得某种反馈/计数器,我可以用它来确定锁被击中的频率。我假设我必须连接到Monitor类才能获得此信息,但我想问一下以前是否有人解决过此问题?您可以使用它来确定CLR获取线程锁的失败尝试总数(总争用次数)或每秒争用率(争用率/秒) 注意,这是总数,因此如果应用程序中有多个线程争用场景,这种方法不会将它们分成单独的计数

我在应用程序中使用C#lock()来确保没有两个或多个线程同时执行同一代码块。lock()是在我发生碰撞后添加的,因此我知道这是可能的,并且会发生不好的事情

现在我正试图找出如何获得某种反馈/计数器,我可以用它来确定锁被击中的频率。我假设我必须连接到Monitor类才能获得此信息,但我想问一下以前是否有人解决过此问题?

您可以使用它来确定CLR获取线程锁的失败尝试总数(总争用次数)或每秒争用率(争用率/秒)

注意,这是总数,因此如果应用程序中有多个线程争用场景,这种方法不会将它们分成单独的计数


您可以使用内置于VisualStudio中的探查器获得有关并发性问题的更详细信息。如果您使用的是VS 2015,您可能希望查看(VS 2017尚未提供)。

根据您是否想知道您获得锁的次数,您有两种选择:

  • 您可以编写自己的性能计数器,并在lock语句中调用它,或者只使用简单的增量进行计数
  • 使用with timeout并计算在指定时间内未获得锁的次数

  • 很明显,但会告诉您在锁中花费了多少时间,这可能比计数更有用:

    private long _lockTicks = 0;
    
    .....
    
    var sw = StopWatch.StartNew();
    lock(_locker)
    {
       sw.Stop();
       _lockTicks += sw.ElapsedTicks;
       //dostuff
    }
    
    ......
    
    
    double seconds = (double)_lockTicks / StopWatch.Frequency;
    

    可能的副本不是真正的副本,因为OP希望重新创建本机锁定机制。这个问题是关于获取指示线程争夺锁资源的频率的指标。2和另一个问题似乎是可以接受的方法。因为我想要锁,所以TryEnter()将在一个while循环中,直到我成功,如果我不能得到锁,我将更新一次计数器(不管我有多少次没有得到它)。谢谢大家的建议。