C#多线程传递值或引用

本文关键字:引用 多线程 | 更新日期: 2023-09-27 18:24:03

我在网上看到一段代码,其中指出调用这样的线程会导致不确定的输出"0223557799"或类似的结果。(你明白了)

for (int i = 0; i < 10; i++)
   new Thread (() => Console.Write (i)).Start();

这就是给出的原因:

"问题是i变量在循环的整个生命周期中都指向相同的内存位置。因此,每个线程都调用Console。写一个变量,它的值可能会随着运行而改变!"

但是,按照惯例,当参数通过值传递时,每个新的线程调用都应该向i发送其递增顺序,对吗?只有通过引用传递值,上述理由才成立。那么,在C#多线程中,这些值是通过引用传递的吗?

我是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;而是CCD_ 2通过引用传递给每个线程。每个线程都共享locals.i,因此可以看到locals.i当前值,而不是创建线程时i的值。

这里有不止一个问题。这当然是从本博客文章中描述的for()循环变量捕获问题开始的。这倾向于产生";10〃;作为输出,但不能保证会发生这种情况,因为线程可能会在循环仍在迭代时执行。

但该程序也存在核心线程问题,无法保证线程会按预期顺序调用Console.Write()。这只是可能,但一个线程可能会领先于另一个线程,并获得保护控制台的锁。一个被称为";螺纹滚道";。