Почему потоки дают разные номера в моей программе, используя ThreadPool? - PullRequest
0 голосов
/ 07 апреля 2011

почему номер имеет другое значение?

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 ]

2 голосов
/ 07 апреля 2011

number распределяется между всеми вашими потоками, и вы ничего не делаете для синхронизации доступа к нему из каждого потока.Таким образом, один поток, возможно, даже не запустил свой цикл i (он может или не может иметь номер сброса до 0 в этой точке), в то время как другой может быть на полпути, а другой мог бы завершить свой цикл полностью и находиться в Console.WriteLine часть.

0 голосов
/ 07 апреля 2011

Если несколько потоков одновременно обращаются к одной и той же переменной, существует риск условий гонки . Состояние гонки в основном происходит, когда операции двух нитей переплетены так, что они мешают друг другу. Чтобы добавить значение в «число», необходимо прочитать старое значение, вычисленную сумму и установить новое значение. Если эти шаги выполняются многими потоками одновременно, установка значения может перезаписать работу, выполненную предыдущими потоками, и конечный результат может измениться. Вы должны использовать блокировку (также называемую критической секцией, мьютексом или монитором), чтобы защитить переменную, чтобы этого не произошло.

0 голосов
/ 07 апреля 2011

Здесь у вас есть 10 потоков, действующих на переменную static number в неопределенное время.Один поток мог на своей итерации 10000, в то время как другой мог только начать выполнение.И ваша процедура начинается со сброса number в 0. Эта логика даст интересные результаты, но ничего непредсказуемого.

...