Как TPL работает в многоядерном процессоре - PullRequest
1 голос
/ 27 августа 2011

Я новичок в параллельном программировании в C # 4.0. Я понимаю, что параллельное программирование и многопоточность - это две разные вещи. Теперь в TPL, если я создаю задачу, как показано ниже:

 Task<int> task1 = new Task<int>(() => {
                for (int i = 0; i < 100; i++) {
                    sum += DoSomeHeavyCalculation(i);
                }
                return sum;
            });

            // start the task
            task1.Start();

Как это будет работать в процессоре Core 2 Duo. Я на самом деле пытаюсь прояснить свои концепции.

1 Ответ

3 голосов
/ 27 августа 2011

Расчет для task1 будет выполняться в одном потоке, отличном * от того, в котором вы сейчас находитесь. Что на самом деле происходит, зависит от кода ниже того, который вы опубликовали.

  • Если там ничего нет и это в основном методе, задача, вероятно, остановится в середине.

  • Если есть task1.Wait() или что-то с использованием task1.Result, текущий поток будет ждать, пока задача не будет завершена, и вы не получите никаких преимуществ в производительности от использования TPL.

  • Если есть какой-то другой сложный расчет, а затем что-то из предыдущего пункта, эти два вычисления будут выполняться параллельно.

Если вы хотите запустить цикл for параллельно, используя все доступные ядра, вы должны использовать Parallel.For или PLINQ :

ParallelEnumerable.Range(0, 100).Select(DoSomeHeavyCalculation).Sum()

* На самом деле, при некоторых обстоятельствах задача может выполняться в одном и том же потоке, но здесь это не имеет значения.

...