为什么线程3在线程1之前启动,甚至我指定线程1在代码中首先启动?

时间:2016-06-14 12:57:07

标签: c# multithreading

        Thread thread1 = new Thread(new ThreadStart(c1.print));
        Thread thread2 = new Thread(new ThreadStart(c2.print));
        Thread thread3 = new Thread(new ThreadStart(c3.print));       

        thread1.Start();
        thread2.Start();
        thread3.Start();

当我运行上面的代码时,有时在线程1和线程2之前打印线程3,即使我指定thread1开始第1个。为什么会这样?

2 个答案:

答案 0 :(得分:2)

仅仅因为你调用Start并不意味着操作系统必须在那时启动线程。它会安排执行,最终它会得到一个允许它运行的时间片,但是这将是非确定性的。

此外,操作系统可以启动线程,然后决定暂停它,同时安排其他一些线程。这里的关键点是,如果线程之间有一个排序要求,那么编写代码就可以实现排序,而不是OS调度程序。

答案 1 :(得分:0)

查看this post中的示例 关键是你可以使用多个线程来分配工作,但是你永远不应该对它们运行的​​顺序有所期望。
线程可能会或可能不会按预期顺序启动。如果它们按预期顺序开始,则可能无法按预期顺序完全执行或完成。

阴险的“问题”是,他们以预期的顺序执行,这导致程序员认为它正在做他们想要的事情。但是偶尔他们不会按顺序运行。重现或调试将很困难或不可能。