21

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

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

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

2 ответа2

18

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

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

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

15

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .