[英]C# Multithreading Pass by value or reference?
我在网上看到一段代码,声称调用这样的线程会导致非确定性输出“0223557799”或类似的东西。(你明白了)
for (int i = 0; i < 10; i++)
new Thread (() => Console.Write (i)).Start();
这就是给出的理由:
“问题是i变量在整个循环的生命周期中引用相同的内存位置。因此,每个线程在一个变量上调用Console.Write,该变量的值可能在运行时发生变化!”
但是,传统上讲,当参数通过值传递时 - 每个新的Thread调用应该发送i增量顺序吗? 只有当值通过引用传递时,上述原因才有效。 那么,在C#多线程中,值是通过引用传递的吗?
我是C#的新手,请理解这个问题是否天真。
您的程序相当于以下程序:
class Locals
{
public int i;
public void M() { Console.Write(this.i);
}
...
Locals locals = new Locals();
for (locals.i = 0; locals.i < 10; locals.i++)
new Thread (locals.M).Start();
现在很清楚为什么你得到了你的结果? 这不是i
说正在按值传递; 相反,它是通过引用每个线程传递的 locals
。 每个线程共享 locals.i
,因此可以看到的当前值locals.i
,而不是价值i
创建线程时了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.