私は、次のようなブロッキング構造を待機しているスレッドを「ウェイクアップ」するのにどれくらいの時間がかかるかを理解しようと試みてきましたAutoResetEvent
. (またはそう)次に、どのスレッドが次に実行される予定かを決定するため、そのスレッドがウェイクアップするまでのスレッドへのシグナル通知の時間差には、0〜15.6ミリ秒のランダムな時間がかかると予想されます。そこで、私の理論をテストするために、この小さなプログラムを書きました。
static void Main(string[] args)
{
double total = 0;
int max = 100;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < max; i++)
{
AutoResetEvent eventHandle = new AutoResetEvent(false);
double time1 = 0;
double time2 = 0;
Thread t1 = new Thread(new ThreadStart(() => time1 = f1(stopwatch, eventHandle)));
Thread t2 = new Thread(new ThreadStart(() => time2 = f2(stopwatch, eventHandle)));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
double diff = time2 - time1;
total += diff;
Console.WriteLine("Diff = " + diff.ToString("F4"));
}
double avg = total / max;
Console.WriteLine("Avg = " + avg.ToString("F4"));
Console.ReadKey();
}
static double f1(Stopwatch s, AutoResetEvent eventHandle)
{
Thread.Sleep(500);
double res = s.Elapsed.TotalMilliseconds;
eventHandle.Set();
return res;
}
static double f2(Stopwatch s, AutoResetEvent eventHandle)
{
eventHandle.WaitOne();
return s.Elapsed.TotalMilliseconds;
}
驚いたことに、平均ウェイクアップ時間は約 0.05 ミリ秒でした。