我是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()
之前,线程调度程序没有足够的时间来在main
和worker
之间切换执行。 {{1}}个线程,因此输出。有人可以澄清/否定我的假设吗?
答案 0 :(得分:4)
您提出的问题通常是在操作系统/多线程课程入门时向大学生展示的第一张幻灯片。基本上你所拥有的是执行线程而不使用locks或其他concurrency control techniques来指定执行。因此,您的执行线程是一系列指令,它们与多线程环境中的其他此类序列同时执行。当发生这种情况时,正如@Andreas和@kurast所提到的,你的程序变得随机。基本上归结为C#中的字节代码首先执行,它可以在程序的每次执行时改变。要解决这个问题,请阅读并发控制,竞争条件和关键部分,以便精确定义线程的调度。
以下是多线程的一些很好的参考资料: