For循环主体执行的值不满足线程代码中的循环条件

问题描述

这很棘手(也许不适合专家)。我正在学习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#)。我什至更惊讶为什么它在语句IndexOutOfRange

中没有引发pool[i] = new Thread(() => Console.Write(i));异常

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

  1. 检查条件(i < 10
  2. 如果条件为真,则执行正文
  3. 增加控制变量(i++
  4. 重复

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

解决方法

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...