При запуске нескольких потоков на многоядерном процессоре гарантируется ли их обработка разными ядрами?

При запуске нескольких потоков на многоядерном процессоре гарантируется ли их обработка разными ядрами?

У меня процессор Pentium core i5, который имеет 4 ядра. Если я сделаю это в консольной программе C#

var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();

гарантированно ли потоки t1 и t2 будут работать на отдельных ядрах?

решение1

Вы не можете гарантировать в .Net, что два Threads будут работать на двух отдельных ядрах. Фактически,вы также не можете гарантировать, что он Threadбудет работать только на одном ядре(!).

Это потому чтоуправляемые потоки — это не то же самое, что потоки ОС- один управляемый поток может использовать несколько потоков ОС для его поддержки. В C# вы имеете дело только с управляемыми Threadпотоками напрямую(по крайней мере, не прибегая к p/invoke для вызова потоковых функций WinAPI, чего делать никогда не следует).

Однако планировщики потоков .Net и Windows очень хороши в том, что они делают - они не будут запускать два потока на одном ядре, пока второе ядро ​​полностью простаивает. Так что, в общем, вам не нужно беспокоиться об этом.

решение2

Нет, ОС и ЦП сами решат, что и когда запускать. В приведенном вами простом примере, за исключением других задач, да, они, скорее всего, будут выполняться параллельно на отдельных ядрах, но редко можно гарантировать, что это будет так.

Вы можете использоватьсродство потокапопытаться взять под контроль распределение ядра для данного потока.

Также рассмотритепланирование приоритетовчтобы расставить все по своим местам, какие потоки должны быть полностью параллельны, а какие могут подождать.

Связанный контент