Cuando inicia varios subprocesos en un procesador de múltiples núcleos, ¿se garantiza que serán procesados ​​por diferentes núcleos?

Cuando inicia varios subprocesos en un procesador de múltiples núcleos, ¿se garantiza que serán procesados ​​por diferentes núcleos?

Tengo un procesador Pentium core i5, que tiene 4 núcleos. Si hago esto en un programa de consola C#

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

¿Se garantiza que los subprocesos t1 y t2 se ejecutarán en núcleos separados?

Respuesta1

No puede garantizar en .Net que dos Threadcorreos electrónicos se ejecuten en dos núcleos separados. De hecho,Tampoco puede garantizar que uno Threadse ejecute en un solo núcleo (!).

Esto es porqueLos subprocesos administrados no son lo mismo que los subprocesos del sistema operativo.- un único subproceso administrado puede utilizar múltiples subprocesos del sistema operativo para admitirlo. En C#, sólo se trata directamente con Threadcorreos electrónicos administrados.(al menos, sin recurrir a p/invoke para llamar a las funciones de subprocesamiento de WinAPI, lo cual nunca deberías hacer).

Sin embargo, los programadores de subprocesos de .Net y Windows son muy buenos en lo que hacen: no ejecutarían dos subprocesos en un solo núcleo mientras un segundo núcleo permanece completamente inactivo. Entonces, en general, no necesitas preocuparte por eso.

Respuesta2

No, el sistema operativo y la CPU decidirán qué ejecutar y cuándo. En el ejemplo simple que ha mostrado, excluyendo otras tareas, sí, lo más probable es que se ejecuten en paralelo en núcleos separados, pero rara vez hay una garantía de que ese sea el caso.

Puedes usar elafinidad del hilopara intentar tomar cierto control sobre la asignación de un núcleo a un hilo determinado.

Considere tambiénprioridades de programaciónpara apilar la plataforma en términos de qué subprocesos deben ser completamente paralelos y cuáles pueden esperar.

información relacionada