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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам