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