WIndows上的多线程

本文关键字:多线程 WIndows | 更新日期: 2023-09-27 18:05:20

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();
    }
}

结果是:

 Main thread: Start a second thread.
 Main thread: Do some work.
 ThreadProc: 0
 Main thread: Do some work.
 ThreadProc: 1
 Main thread: Do some work.
 ThreadProc: 2
 Main thread: Do some work.
 ThreadProc: 3
 Main thread: Call Join(), to wait until ThreadProc ends.
 ThreadProc: 4
 ThreadProc: 5
 ThreadProc: 6
 ThreadProc: 7
 ThreadProc: 8
 ThreadProc: 9
 Main thread: ThreadProc.Join has returned.  Press Enter to end program.

我不明白为什么"ThreadProc 0"1"2"3"可以出现在"主线程:做一些工作"之间。

有人能帮我解释一下吗?谢谢!

WIndows上的多线程

"t.Start()"行启动与主线程同时运行的另一个线程

我认为它会帮助你阅读计算机科学中的线程。

线程(用我的话来说)是一个异步的工作单元。处理器在程序中的不同线程之间跳转,以不同的间隔完成工作。这样做的好处是可以在一个线程上执行工作,而另一个线程正在等待某些事情(比如thread . sleep(0))。你也可以使用多核cpu,因为一个核心可以同时执行一个线程。

这能解释一些吗?

这个想法是,每个线程就像包含在程序进程中的一个小进程。操作系统然后将CPU执行时间分配给它们。

对Sleep的调用加速了从一个线程到下一个线程的切换。如果没有它们,您可能看不到交织在一起的输出,但是您可能会看到—关键是,当您创建多个线程时,执行哪个线程以及何时执行并不是由您决定的—这就是为什么您必须假设任何线程都可能在任何时间执行并引导您进入锁定和同步的概念(我相信您将在下一个或很快遇到)。

这似乎是正确的。只要你启动ThreadProc

t.Start();

与主线程同时运行。因此,系统将打印哪个打印语句先出现。由于两个循环同时进行,因此将合并语句。

MSDN表示Thread.Start()方法

使操作系统改变当前的状态实例到ThreadState.Running。一旦线程处于ThreadState。运行状态,运行状态系统可以调度执行。

你提供的输出清楚地显示操作系统立即运行线程,然后在两个线程之间切换控制,试试

t.Priority = ThreadPriority.Lowest;
t.Start();

查看执行顺序是否改变