同时运行Threads给出不同的数字

时间:2017-05-30 16:57:29

标签: c# multithreading

我现在想知道一点。我只是阅读了一些关于线程的信息并在那里登陆:任务与线程差异[重复]在这里来自Jacek的stackoverflow(抱歉无法创建一个链接,因为我只能创建2名声望< 10)

来自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.所有这一切都变得越来越疯狂,睡眠时间越短,所以如果你完全删除它就绝对会随机掉落

1 个答案:

答案 0 :(得分:0)

当您在主线程上执行第一个循环并在单独的线程上启动WriteY()时,绝对无法预测一个线程中的事件相对于另一个线程中的事件发生的顺序。

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

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

这告诉了我们关于多线程操作的一些事情:

  • 当我们想要跨线程分配工作时,同步或并行执行是有益的,但是当事件必须以可预测的顺序发生时,并不是这样。
  • 需要格外小心,因为如果我们做错了,它似乎无论如何都会起作用。然后偶尔它将无法工作。那些不起作用的情况将非常难以调试,其中一个原因是你无法在你想要的时候重复这种行为。