2

次のC#コードがあります:

using System;
using System.Threading;

// Simple threading scenario:  Start a static method running
// on a second thread.
public class ThreadExample {
    // The ThreadProc method is called when the thread starts.
    // It loops ten times, writing to the console and yielding 
    // the rest of its time slice each time, and then ends.
    public static void ThreadProc() {
        for (int i = 0; i < 10; i++) {
            Console.WriteLine("ThreadProc: {0}", i);
            // Yield the rest of the time slice.
            Thread.Sleep(0);
        }
    }

    public static void Main() {
        Console.WriteLine("Main thread: Start a second thread.");
        // The constructor for the Thread class requires a ThreadStart 
        // delegate that represents the method to be executed on the 
        // thread.  C# simplifies the creation of this delegate.
        Thread t = new Thread(new ThreadStart(ThreadProc));

        // Start ThreadProc.  Note that on a uniprocessor, the new 
        // thread does not get any processor time until the main thread 
        // is preempted or yields.  Uncomment the Thread.Sleep that 
        // follows t.Start() to see the difference.
        t.Start();
        //Thread.Sleep(0);

        for (int i = 0; i < 4; i++) {
            Console.WriteLine("Main thread: Do some work.");
            Thread.Sleep(0);
        }

        Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
        t.Join();
        Console.WriteLine("Main thread: ThreadProc.Join has returned.  Press Enter to end program.");
        Console.ReadLine();
    }
}

大学へのスレッドを勉強してから長い時間が経ちましたが、今でも覚えているのは次のことだけです。

スレッドの実行はかなり予測不可能であり、基盤となる OS によって異なる場合があります。

したがって、本当の問題は、ThreadProcの最初の実行についてさえ確信が持てないのはなぜですか? を実行するとどうなりt.Start()ますか? すべての実行でThreadProc: 0直後に出力されないのはなぜですか?Main thread: Start a second thread

4

1 に答える 1

7

ThreadProc の最初の実行についてさえ確信が持てないのはなぜですか?

これは.NETでもWindowsOSのドキュメントでも非決定論的であるためです(Windowsを使用していると思います)

t.Start() を実行するとどうなりますか?

スレッドは、実行のために OS によってスケジュールされます。MSDN : 「スレッドの実行がスケジュールされます。」

ThreadProc: 0 が Main thread: Start a second thread in every execution の直後に出力されないのはなぜですか?

Thread.Start()呼び出しと実際のスレッド開始の間に遅延があるため

于 2013-04-17T15:41:24.960 に答える