为什么首先调用主线程的委托?

时间:2014-08-15 20:12:07

标签: c# multithreading

我是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);
    }
}

输出

  

主要来自

     

来自工人的你好

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

static void PrintName()
{
    if (Thread.CurrentThread.Name == "main")
    {
        Thread.Sleep(x);
    }

    Console.WriteLine("Hello from " + Thread.CurrentThread.Name);
}

其中x> = 2,然后以相反的顺序输出消息

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

1 个答案:

答案 0 :(得分:4)

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

以下是多线程的一些很好的参考资料:

  1. Mutex example / tutorial
  2. To Mutex or Not To Mutex?
  3. Parallel Processing and Concurrency in the .NET Framework
  4. 如果您有任何疑问,请与我们联系!