【发布时间】:2013-01-09 04:51:40
【问题描述】:
for (int i = 0; i < 10; i++)
new Thread (() => Console.Write (i)).Start();
正如预期的那样,上述代码的输出是不确定的,因为 i 变量在循环的整个生命周期中都指向同一个内存位置。因此,每个线程都会在一个变量上调用 Console.Write,该变量的值可能会在运行时发生变化
然而,
for (int i = 0; i < 10; i++)
{
int temp = i;
new Thread (() => Console.Write (temp)).Start();
}
也给出了不确定的输出!我认为变量 temp 是每个循环迭代的本地变量。因此,每个线程捕获了不同的内存位置,应该存在np问题。
【问题讨论】:
-
输出的不确定性是什么?
-
第二个版本应该可以工作 - Eric Lippert 在这里写了关于循环变量闭包的博客:blogs.msdn.com/b/ericlippert/archive/2009/11/12/…
-
它不应该是“确定性的”,因为“调度的线程的顺序总是相同的”。也许这就是问题的意思?
-
你的意思是你的输出应该打印为 123...9?
-
@JeffWatkins int 是一个原语,但是因为它是在闭包中捕获的,所以它实际上存储在一个堆对象中。第一个示例在堆上创建一个闭包对象,所有 10 个线程都使用该对象。第二个示例在堆上创建了 10 个不同的闭包对象,每个线程一个。按照 Paolo 指向 Eric Lippert 博客的链接,或阅读 Honza Brestan 的回答进行简短讨论。
标签: c# multithreading