簡體   English   中英

C#lock(),無論如何獲取指標?

[英]C# lock(), anyway to get metrics?

我在應用程序中使用C#lock()來確保沒有兩個或多個線程同時執行同一代碼塊。 在發生碰撞后添加了lock(),因此我知道這是可能的,並且會發生壞事。

現在,我試圖弄清楚如何獲得某種反饋/計數器,可以用來確定鎖被擊中的頻率。 我以為我必須掛接到Monitor類來獲取此信息,但以為我會問是否有人解決過此問題?

根據您是否想知道獲得鎖的次數,您有兩種選擇:

  1. 您可以編寫自己的性能計數器,並在lock語句中調用它,也可以僅使用一個簡單的增量進行計數。
  2. 您將Monitor.TryEnter與超時一起使用,並計算在指定時間內沒有獲得鎖定的次數。

您可以使用性能計數器來確定CLR嘗試獲取線程鎖的失敗嘗試總數(爭用總數)或每秒的速率(爭用率/秒)。

https://msdn.microsoft.com/en-us/library/zf749bat(v=vs.110).aspx

注意,這是總數,因此,如果您的應用程序中有多個線程爭用方案,則此方法不會將它們分解為單獨的計數。

您可以使用Visual Studio內置的探查器獲取有關並發問題的更多詳細信息。 如果您使用的是VS 2015,則可能要簽出Concurrency Visualizer (VS 2017尚不可用)。

很明顯,但是可以告訴您在鎖中花費了多少時間,這可能比計數更有用:

private long _lockTicks = 0;

.....

var sw = StopWatch.StartNew();
lock(_locker)
{
   sw.Stop();
   _lockTicks += sw.ElapsedTicks;
   //dostuff
}

......


double seconds = (double)_lockTicks / StopWatch.Frequency;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM