У меня процессор Pentium core i5, который имеет 4 ядра. Если я сделаю это в консольной программе C#
var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
гарантированно ли потоки t1 и t2 будут работать на отдельных ядрах?
решение1
Вы не можете гарантировать в .Net, что два Thread
s будут работать на двух отдельных ядрах. Фактически,вы также не можете гарантировать, что он Thread
будет работать только на одном ядре(!).
Это потому чтоуправляемые потоки — это не то же самое, что потоки ОС- один управляемый поток может использовать несколько потоков ОС для его поддержки. В C# вы имеете дело только с управляемыми Thread
потоками напрямую(по крайней мере, не прибегая к p/invoke для вызова потоковых функций WinAPI, чего делать никогда не следует).
Однако планировщики потоков .Net и Windows очень хороши в том, что они делают - они не будут запускать два потока на одном ядре, пока второе ядро полностью простаивает. Так что, в общем, вам не нужно беспокоиться об этом.
решение2
Нет, ОС и ЦП сами решат, что и когда запускать. В приведенном вами простом примере, за исключением других задач, да, они, скорее всего, будут выполняться параллельно на отдельных ядрах, но редко можно гарантировать, что это будет так.
Вы можете использоватьсродство потокапопытаться взять под контроль распределение ядра для данного потока.
Также рассмотритепланирование приоритетовчтобы расставить все по своим местам, какие потоки должны быть полностью параллельны, а какие могут подождать.