C# 多线程按值传递还是引用传递?

标签 c# multithreading variables memory-management pass-by-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 是创建线程的时间。

关于C# 多线程按值传递还是引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17774240/

相关文章:

c# - LINQ 查询返回第一个结果的多个副本

c# - MailMessage - 打开附件时出错

multithreading - tomcat关闭时关闭线程的正确方法是什么?

java - 转义序列无效(有效的是\b\t\n\f\r\”\'\\)"语法错误

python - 传递变量以供模块导入和使用

C# - 子类中的自定义构造函数

c# - 在acumatica中使用webservices api导出数据时如何设置超时

c++ - 等待事件的线程并不总是捕获事件信号

multithreading - Lparallel.queue 线程安全吗?

javascript - 计算递归函数中变量的结果