方法作为线程调用!它们在有序的堆栈中吗?

本文关键字:堆栈 线程 调用 方法 | 更新日期: 2023-09-27 18:16:33

我有这样的代码:

for (int i = 0; i < 10000; i++)
{
    printValue(i);
}
private void printValue(int value)
{
    Console.WriteLine(value);
}

是否存在打印的数字不顺序的情况?

我的意思是,也许方法printValue(60)的线程在printValue(50)之前执行?(只是作为例子)。

或者它们是同步的?

方法作为线程调用!它们在有序的堆栈中吗?

从这个代码片段中我可以看到,只有一个线程,它顺序地执行printValue函数调用。所以不存在同步问题,因为只有一个线程。

如果你的循环是在一个由多个线程调用的函数中:

private void Foo()
{
  for (int i = 0; i < 10000; i++)
  {
      printValue(i);
  }
}

那么绝对不能保证每个线程的值会按顺序显示

如何调用循环?这决定了如何调用printValue方法。如果你在两个并行任务中调用循环,输出肯定会混淆!

为了确保输出总是正确的顺序,你必须让代码的敏感部分"线程安全"。有关线程同步的更多信息,请查看http://www.albahari.com/threading/part2.aspx。

试试这个来获得"线程安全"

public class SomeClass{
    private static object lockObject = new object();
    public void Foo(){
        lock(lockObject){
            for (int i = 0; i < 10000; i++)
            {
                printValue(i);
            }
        }
    }
    private void printValue(int value)
    {
        Console.WriteLine(value);
    }
}

当然,有可能解决线程安全,但这应该工作得很好:-)