[英]C# lock(), anyway to get metrics?
我在應用程序中使用C#lock()來確保沒有兩個或多個線程同時執行同一代碼塊。 在發生碰撞后添加了lock(),因此我知道這是可能的,並且會發生壞事。
現在,我試圖弄清楚如何獲得某種反饋/計數器,可以用來確定鎖被擊中的頻率。 我以為我必須掛接到Monitor類來獲取此信息,但以為我會問是否有人解決過此問題?
根據您是否想知道獲得鎖的次數,您有兩種選擇:
您可以使用性能計數器來確定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.