【问题标题】:For loop body executes with a value that does not meet the loop condition in threaded code [duplicate]For循环体执行的值不符合线程代码中的循环条件[重复]
【发布时间】:2020-08-14 16:39:29
【问题描述】:

这是一个棘手的问题(可能不适合专家)。我正在学习 C# 中的并发性,并且正在使用一些虚拟代码来测试线程的基础知识。我很惊讶以下代码有时会打印出 10 的值。

Thread[] pool = new Thread[10];

for(int i = 0; i < 10; i++)
{
   pool[i] = new Thread(() => Console.Write(i));
   pool[i].Start();
}

典型的输出类似于76881079777。我知道值是 10 而不是 1 和 0,因为 for 循环体执行了 10 次(不确定,但我无法破坏 C#)。我更惊讶为什么这不会在语句pool[i] = new Thread(() =&gt; Console.Write(i)); 中抛出IndexOutOfRange 异常

据我所知,for 循环的执行方式如下:

  1. 检查条件(i &lt; 10
  2. 如果条件为真则执行主体
  3. 增加控制变量 (i++)
  4. 重复

因此,假设我无法理解如何以 10 的值执行主体。有什么想法吗?

【问题讨论】:

    标签: c# .net multithreading thread-safety


    【解决方案1】:

    当您调用pool[i].Start(); 时,并不意味着() =&gt; Console.Write(i) 会立即执行。相反,操作系统决定何时执行传递的方法(这也称为“调度”)。例如,操作系统可能决定在您的循环完成后执行您的线程之一。在这种情况下,i 是 10;所以这就是为什么可能输出 10 的原因。

    【讨论】:

    • 我什至没有想到这一点。现在看来很合理。谢谢!
    • 不客气! :)
    猜你喜欢
    • 1970-01-01
    • 2021-02-13
    • 2017-03-28
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多