【发布时间】:2011-02-12 18:08:38
【问题描述】:
嗨 我正在阅读“C# 中的线程”教程。它提到的一件事是:
“CLR 为每个线程分配自己的内存堆栈,以便局部变量保持独立”
还有这个例子:
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
for (int i = 0; i < 20; i++) {
Thread t = new Thread(() => {
Console.WriteLine(i);
});
t.Start();
}
Console.ReadLine();
}
}
}
输出: 1 2 2 4 6 8 10 10 10 10 12 12 14 15 17 18 18 20 20
所以我理解这里发生的事情的方式是:
- 主线程开始执行 for 循环。
- 一个新线程被实例化和定义,这样它将接收“i”的值 并将其打印到控制台。
- 线程实例在主线程继续工作的同时启动。
“i”是一个整数,我的猜测是新线程将在其内存堆栈中拥有自己的副本。然后将值打印到控制台。但正如结果显示的那样,它跳过了从 10 到 12 或 12 到 14 的值。 那么新线程是否正在接收对 i 的引用?但是如果“i”是一个整数,那么新线程不应该在它的内存堆栈中存储一个新值,而不是一个对 i 的引用。
还有为什么会有重复值?它打印了几次 2,10,12,18,20。
谢谢。
【问题讨论】:
-
哪个教程?该示例是否与该文本直接相关?
-
读了cmets后,发现作者确实提到了lamda表达式和共享变量的问题。我想我太专注于我认为它应该如何工作并且没有或不想意识到对于 lamda 表达式来说事情是不同的。感谢您的示例、回复和链接。 (这里是教程的链接:albahari.com/threading 部分 Lambda 表达式和捕获的变量)
标签: c# multithreading