方法作为线程调用!它们在有序的堆栈中吗?
本文关键字:堆栈 线程 调用 方法 | 更新日期: 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);
}
}
当然,有可能解决线程安全,但这应该工作得很好:-)