-4

マルチスレッド システム (2 つのスレッドで十分) を実装したいので、チュートリアルに従いました。

    Thread t1 = new Thread(new ThreadStart(threadA));
    Thread t2 = new Thread(new ThreadStart(threadB));
    t1.Start();
    t2.Start();

「threadA」「threadA」「threadA」「threadB」「threadB」「threadB」が示すように、出力は私にとって予期しないものです。
私のコードに何か問題がありますか? どうもありがとう。

4

2 に答える 2

2

要するに、OS ごと、CPU ごとに異なる多くの実装の詳細に基づいて、CLR と OS がスレッドを実行するようにスケジュールしたときにスレッドが実行されるということです。

Thread クラスを使用すると、スレッド スケジューリングに対する CLR の制御レベルの大部分を占める ThreadPool を回避できますが、スレッドの実行時期は OS カーネルが決定します。あなたのケースでは、各スレッドが単に 3 行をコンソールに出力している場合、OS が他のスレッドを開始する前に 1 つのスレッドが終了することが完全に予想されます。

ただし、スレッドが実行される順序を保証することはできません。そのため、このコードを (Join() ステートメントを使用して) ループして 100 回実行すると、スレッドが OS によって異なる時間にスケジュールされるため、「threadA」と「threadB」のいくつかの異なる順列が表示される場合があります。2 つの EU が同時に利用可能である場合、かなりの重複があります。スレッド A がスレッド B よりも重要度が低いと見なされた場合、スレッド B は、スレッド A が開始する前に完全に実行される可能性があります。

于 2012-04-04T21:26:45.207 に答える
1

t1.Start()これが起こっているのは、あなたがからに行くのにかかる時間の中でt2.Start()、あなたt1はすでに完了しているからです。

コードを少し変更したい場合は、このようなものを試してください

Thread t1 = new Thread(
    new ThreadStart(()=>
    {
        for(int i = 0; i < 3; i++)
        {
            System.Console.WriteLine("ThreadA");    
            Thread.Sleep(3000)
        }
    }));
Thread t2 = new Thread(
    new ThreadStart(()=>
    {
        for(int i = 0; i < 3; i++)
        {
            System.Console.WriteLine("ThreadB");    
            Thread.Sleep(1000)
        }
    }));
t1.Start();
t2.Start();

次のように出力されます。

ThreadA
ThreadB
ThreadB
ThreadA
ThreadB
ThreadA

ただし、これは、スレッド化に関しては、順序を保証できないことを示しています。

于 2012-04-04T21:27:54.140 に答える