为什么首先调用主线程'

本文关键字:线程 调用 为什么 | 更新日期: 2023-09-27 18:18:07

我是c#多线程的新手。我创建了以下程序:

class Program
{
    static void Main(string[] args)
    {
        Thread.CurrentThread.Name = "main";
        Thread t = new Thread(PrintName);
        t.Name = "worker";
        
        t.Start();
        PrintName();
        Console.ReadKey();
    }
    static void PrintName()
    {
        Console.WriteLine("Hello from " + Thread.CurrentThread.Name);
    }
}

输出为

from main

来自worker的Hello

如果我将PrintName()方法的主体改为

static void PrintName()
{
    if (Thread.CurrentThread.Name == "main")
    {
        Thread.Sleep(x);
    }
    Console.WriteLine("Hello from " + Thread.CurrentThread.Name);
}

,其中x>= 2,则消息以倒序输出

为什么会这样?我的理由是,在第一种情况下,即使Main()方法中的t.Start()先于PrintName(),线程调度器也没有足够的时间在mainworker线程之间切换执行,因此输出。有人能澄清/否定我的假设吗?

为什么首先调用主线程'

你问的问题通常是在向大学生展示操作系统/多线程入门课程的第一张幻灯片上。从本质上讲,您所拥有的是在不使用锁或其他并发控制技术来指定执行的情况下执行线程。因此,您的执行线程是一个指令序列,这些指令序列在多线程环境中与其他此类序列并发执行。当这种情况发生时,正如@Andreas和@kurast所提到的,您的程序变得随机。从本质上讲,这在c#中归结为首先执行的字节码,这可以在每次执行程序时更改。要解决这个问题,请仔细阅读并发控制、竞争条件和临界区,以便精确地定义线程的调度。

下面是一些很好的多线程参考:

  1. 互斥锁示例/教程
  2. 要互斥还是不互斥?
  3. .NET框架中的并行处理和并发性

如果你有任何问题请告诉我!