【问题标题】:Simultaneously running Threads giving different numbers同时运行线程给出不同的数字
【发布时间】:2017-05-30 16:57:29
【问题描述】:

我现在有点想知道。我刚刚阅读了一些关于线程的信息并在那里登陆:任务与线程的差异 [重复] 在 Jacek 的 stackoverflow 上(抱歉无法创建链接,因为我只能用信誉制作 2 个

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();
    }

我预计会发生的事情(以及大部分时间会发生的事情)是这样的: 好话题:

但这是我想知道的事情(它绝对是随机的并且承诺相同的代码):

奇迹线:

我的问题:

1.线程应该始终同时运行的不同数量的线程不应该它们怎么会发生这种情况?

2.睡眠时间越短,这一切都会变得越疯狂,所以如果你完全移除它,它就会完全随机

【问题讨论】:

  • “线程应该总是同时运行吗?” -- 不。想象一下如何保证两个线程中的两个循环在每一步都同步。这是可能的,但您必须编写大量代码才能实现。您的计算机上正在运行许多许多进程和线程。他们每个人都有一点时间来做他们的事情。线程混乱。如果运行相同代码的两个线程总是碰巧在在用户看来在同一时间做同样的事情,那么圣诞老人级别的奇迹就是。
  • 如果您想同步它们,请使用适当的机制
  • @ed 我明白了,感谢您的快速回答
  • @Gonzalo 你能不能给我一个例子我是编码新手不知道适当的机制,但无论如何都会搜索它谢谢你们俩

标签: c# multithreading


【解决方案1】:

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

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

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

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

  • 当我们想要跨线程分配工作时,并发或并行执行是有益的,但当事件必须以可预测的顺序发生时则不然。
  • 需要格外小心,因为如果我们做错了,它似乎仍然可以工作。然后偶尔就不行了。那些不起作用的情况将非常难以调试,原因之一是您无法在需要时重复该行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多