为什么线程使用ThreadPool在我的程序中给出不同的数字?

时间:2011-04-07 13:43:04

标签: threadpool

为什么Number有不同的值?

THX

class Program
{
    static DateTime dt1;
    static DateTime dt2;
    static Int64 number = 0;
    public static void Main()
    {
        dt1 = DateTime.Now;

        for (int i = 0; i < 10; i++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(WorkThread), DateTime.Now);
        }


        dt2 = DateTime.Now;
        Console.WriteLine("***");
        Console.ReadLine();
    }

    public static void WorkThread(object queuedAt)
    {
        number = 0;
        for (Int64 i = 0; i < 2000000; i++)
        {
            number += i;
        }
        Console.WriteLine("number is:{0} and time:{1}",number,DateTime.Now - dt1);
    }
}

3 个答案:

答案 0 :(得分:2)

number在所有线程之间共享,并且您没有做任何事情来同步每个线程对它的访问。所以一个线程甚至可能没有启动它的i循环(此时它可能会或者可能没有将数字重置为0),而另一个线程可能已经完成了一半,而另一个可能完全完成了它的循环并且处于Console.WriteLine部分。

答案 1 :(得分:0)

这里有10个线程在不确定的时间作用于static变量number。一个线程可以在10000次迭代中,而另一个线程可以开始执行。而你的例程首先将number重置为0.这个逻辑会产生有趣的结果,但没有任何可预测的结果。

答案 2 :(得分:0)

如果多个线程同时访问同一个变量,则存在竞争条件的风险。竞争条件基本上是当两个线程的操作交织在一起使得它们彼此干扰时。要将值添加到“数字”,必须读取旧值,计算总和以及设置新值。如果这些步骤同时由许多线程完成,则值设置可以覆盖先前线程完成的工作,最终结果可能会发生变化。您必须使用锁(也称为临界区,互斥锁或监视器)来保护变量,这样就不会发生这种情况。