同时运行线程给出不同的数字

问题描述:

我想知道这一刻。我只是读了一些关于线程和降落在那里:任务与线程差异[复制]来自Jacek的*(对不起,不能创建一个链接,因为我只能使用声誉<)同时运行线程给出不同的数字

和第一条评论来自MoonKnight带我到那里:albahari.com/threading

我已经采取了代码,并改变了一点,使其更好地阅读能够发生什么。这里说到我改变的代码:

static void Main() 
    { 
     Thread t = new Thread(WriteY);   // Kick off a new thread 
     t.Start();        // running WriteY() 

     // Simultaneously, do something on the main thread. 
     for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1); Console.Write(i); }; 
     Console.ReadLine(); 
    } 

    static void WriteY() 
    { 
     for (int y = 0; y < 10; y++) { System.Threading.Thread.Sleep(1); Console.Write(y); }; 
     Console.ReadLine(); 
    } 

我的预期发生(会发生什么,大部分的时间)是这样的: 好主题: enter image description here

但这里是我想知道的东西(它绝对随机并承诺相同的代码):

奇迹螺纹:

enter image description here

我的问题:

1.这是怎么发生的,有不同的数字线程应该始终运行在同一时间不应该他们?

2.所有这变得更加疯狂的睡眠时间变得如此,如果你删除它完全是荒原绝对随机下部

+4

*“线程应该总是在同一时间运行?”* - 没有。想象一下,如何保证两个线程中的两个循环在每个步骤中都同步。这是可能的,但你必须写出相当数量的代码才能实现。计算机上正在运行许多许多进程和线程。他们每个人都有一点时间去做自己的事情。线程是凌乱的。如果两个运行相同代码的线程总是碰巧在用户看来是同一时刻做同样的事情,那么圣诞老人级的奇迹就是如此。 –

+0

如果你想同步它们,使用适当的机制 –

+0

@ed我看到感谢您的快速答案 – Pr0gr4mm3r

当你执行主线程上的第一个环和一个单独的线程开始WriteY(),有绝对没有办法预测一个线程中的事件相对于另一个线程中的事件发生的顺序。

我已经写了一些测试来证明这一点。 Here's one。和here's another

这两个例子的特征是它们经常以“预期”顺序运行,但偶尔它们不会。

这告诉我们关于多线程操作的几件事情:

  • Concurrencty或并行执行是有益的,当我们想在线程之间分配工作,而不是在事件发生,必须以可预测的顺序。
  • 它需要特别小心,因为如果我们做错了,它似乎无论如何工作。然后偶尔会失效。那些无法正常工作的场合将非常难以调试,其中一个原因是您无法在需要时重复这些行为。