Quando você inicia vários threads em um processador multi-core, é garantido que eles serão processados ​​por núcleos diferentes?

Quando você inicia vários threads em um processador multi-core, é garantido que eles serão processados ​​por núcleos diferentes?

Eu tenho um processador Pentium core i5, que possui 4 núcleos. Se eu fizer isso em um programa de console C#

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

é garantido que os threads t1 e t2 sejam executados em núcleos separados?

Responder1

Você não pode garantir no .Net que dois Threads sejam executados em dois núcleos separados. Na verdade,você também não pode garantir que um Threadserá executado em apenas um núcleo (!).

Isto é porquethreads gerenciados não são iguais aos threads do sistema operacional- um único thread gerenciado pode usar vários threads do sistema operacional para suportá-lo. Em C#, você só lida diretamente com Threads gerenciados(pelo menos, sem recorrer a p/invoke para chamar as funções de threading do WinAPI, o que você nunca deve fazer).

No entanto, os agendadores de threads .Net e Windows são muito bons no que fazem - eles não executariam dois threads em um único núcleo enquanto um segundo núcleo fica completamente ocioso. Então, em geral, você não precisa se preocupar com isso.

Responder2

Não, o sistema operacional e a CPU decidirão o que executar e quando. no exemplo simples que você mostrou, com exclusão de outras tarefas, sim, elas provavelmente seriam executadas em paralelo em núcleos separados, mas raramente há garantia de que esse será o caso.

Você pode usar oafinidade de threadtentar assumir algum controle sobre a alocação de um núcleo para um determinado thread.

Considere tambémprioridades de agendamentopara empilhar o baralho em termos de quais threads devem ser totalmente paralelos e quais podem esperar.

informação relacionada