【问题标题】:Why does the main thread's delegate get invoked first?为什么要先调用主线程的委托?
【发布时间】:2014-08-15 20:12: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);
    }
}

输出是

来自 main 的你好

工人问好

如果我将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 线程之间切换执行,因此输出。有人可以澄清/否定我的假设吗?

【问题讨论】:

  • 您不能指望任何订单,不能保证。如果您需要执行顺序,则需要以线程安全的方式进行
  • 输出的顺序是不确定的,取决于你的架构,操作系统等。启动一个线程是相对昂贵的,因此在大多数情况下main消息首先打印。

标签: c# multithreading


【解决方案1】:

您提出的问题通常是在操作系统/多线程课程介绍中向大学生展示的第一张幻灯片。基本上你所拥有的是一个线程的执行,而不使用locks 或其他concurrency control techniques 来指定你的执行。因此,您的执行线程是在多线程环境中与其他此类序列同时执行的指令序列。当这种情况发生时,正如@Andreas 和@kuast 所提到的,您的程序会变得随机。本质上,这在 C# 中归结为首先执行的字节码,它可以在程序的每次执行时发生变化。为了解决这个问题,阅读并发控制、竞争条件和关键部分,以便精确定义线程的调度。

以下是多线程的几个很好的参考:

  1. Mutex example / tutorial
  2. To Mutex or Not To Mutex?
  3. Parallel Processing and Concurrency in the .NET Framework

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多