4

私は、次のようなブロッキング構造を待機しているスレッドを「ウェイクアップ」するのにどれくらいの時間がかかるかを理解しようと試みてきました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 ミリ秒でした。

4

1 に答える 1

6

いいえ、15.625ミリ秒はクロックティック割り込みの期間です。これにより、スレッドがブロックせずに実行されていて、スケジューラーが別のスレッドに順番を回す必要があると判断した場合、スケジューラーはそのスレッドを中断できます。

ブロックするスレッドは、WaitXxx() 呼び出しで横取りされます。または Sleep() 呼び出し。クロックティック割り込みに関係なく。

同様に注目に値するのは、スリープ中のスレッドはクロック割り込みティックでのみ実行を再開できることです。これは、Thread.Sleep(1) が実際に 15.6 ミリ秒スリープする理由です。タイマー、DateTime.Now、および Environment.TickCount にもその精度があり、クロックは割り込みによってインクリメントされます。

于 2014-03-18T01:07:01.783 に答える