【问题标题】:How to get thread results through local variables?如何通过局部变量获取线程结果?
【发布时间】:2014-10-30 11:36:43
【问题描述】:

我正在尝试通过局部变量获取线程结果。

有代码:

static void Main() 
{   
    long res1 = 0, res2 = 0;

    long n1 = 5000, n2 = 10000; 

    Thread t1 = new Thread(() => 
    { 
        res1 = Factorial(n1); 
    }); 

    Thread t2 = new Thread(() => { res2=Factorial(n2); }); 

    t1.Start();  
    t2.Start(); 
    t1.Join();  
    t2.Join(); 

    Console.WriteLine("Factorial of {0} equals {1}", n1, res1); 
    Console.WriteLine("Factorial of {0} equals {1}", n2, res2); 
} 

输出:

Factorial of 5000 equals 0
Factorial of 10000 equals 0

为什么这段代码返回 0?

这是阶乘函数:

static long Factorial(long n) 
{ 
    long res = 1; 
    do 
    { 
        res = res * n; 
    } while(--n > 0); 

    return res; 
} 

【问题讨论】:

  • 使用Task 获得结果更加容易。您不需要自己编组结果。

标签: c# .net multithreading lambda task-parallel-library


【解决方案1】:

使用线程或变量捕获没有问题。您的 Factorial 方法只返回 0,因为 res = res * n 会快速溢出,直到达到这些值:

long res = -9223372036854775808;
long n = 4938;

Console.WriteLine(res * n);

您可以看到结果为 0,如果我们用checked 包围计算,我们将得到一个OverflowException

long res = -9223372036854775808;
long n = 4938;

checked
{
    Console.WriteLine(res*n);
}

当然,如果 res 变为 0 一次,任何进一步的乘法也会导致 0。

我不确定您要计算什么,但您可能需要不同的(更大的)数字数据类型(例如decimal

【讨论】:

  • 一个有趣的错误。如果 OP 只是使用调试器,就会被发现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多