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 Thread
s sejam executados em dois núcleos separados. Na verdade,você também não pode garantir que um Thread
será 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 Thread
s 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.