我不是線程專家,但爲了獲得更多的時間es其他線程試圖在對象上工作,您可能必須實現比Lock
更加原始版本的鎖定機制。我用一個緊密環繞的Monitor.TryEnter對它進行了一些處理,並歡迎評論。
當然,單獨實現這樣的東西很容易導致更長的阻塞時間和更多的塊,以便獲得您想要的計數,並基於事實上該實現肯定不同於內部鎖的工作方式。無論如何,我花了時間,所以我會發布它。
class Program
{
static object lockObj = new object();
static void Main(string[] args)
{
System.Threading.Thread t = new System.Threading.Thread(proc);
System.Threading.Thread t2 = new System.Threading.Thread(proc);
t.Start();
t2.Start();
t.Join();
t2.Join();
Console.WriteLine("Total locked up time = " + (LockWithCount.TotalWaitTicks/10000) + "ms");
Console.WriteLine("Total blocks = " + LockWithCount.TotalBlocks);
Console.ReadLine();
}
static void proc()
{
for (int x = 0; x < 100; x++)
{
using (new LockWithCount(lockObj))
{
System.Threading.Thread.Sleep(10);
}
}
}
}
上面展示瞭如何通過替換現有的Lock() {}
與using(new LockWithCount(x)) {}
class LockWithCount : IDisposable
{
static System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
object lockObj;
public static long TotalWaitTicks = 0;
public static long TotalBlocks = 0;
static LockWithCount()
{
watch.Start();
}
public LockWithCount(object obj)
{
lockObj = obj;
long startTicks = watch.ElapsedTicks;
if (!System.Threading.Monitor.TryEnter(lockObj))
{
System.Threading.Interlocked.Increment(ref TotalBlocks);
System.Threading.Monitor.Enter(lockObj);
System.Threading.Interlocked.Add(ref TotalWaitTicks, watch.ElapsedTicks - startTicks);
}
}
public void Dispose()
{
System.Threading.Monitor.Exit(lockObj);
}
}
儘管我的回答如下,但如果您想在沒有探查器的情況下測量這個*,FMM有我能看到的唯一實際答案。 –
如果您正在研究整個併發性問題,您可能會發現這一點很方便。這是關於「C#5.0 In A Null Shell」線程的整個部分http://www.albahari.com/threading/ –