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();
os threads t1 e t2 têm garantia de execução em núcleos separados?
t1
et2
for executado em momentos diferentes em uma ordem arbitrária (por exemplo, é possívelt2
iniciar antest1
em alguns modelos).Respostas:
Você não pode garantir no .net que dois
Thread
s sejam executados em dois núcleos separados. De fato, você também não pode garantir que umThread
seja executado em apenas um núcleo (!) .Isso ocorre porque os threads gerenciados não são iguais aos threads do SO - um único Thread gerenciado pode usar vários threads do SO para suportá-lo. Em C #, você só lida diretamente 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 inativo. Portanto, em geral, você não precisa se preocupar com isso.
fonte
Thread
s são threads de SO. Mas não é por isso que não há garantia de que um único encadeamento sempre seja executado no mesmo núcleo.async
palavra-chave (que é do que suponho que você esteja falando, como "threads assíncronos" é redundante) é apenas um açúcar sintático para usar umBackgroundWorker
thread, que é como qualquer outro thread .Net - você não pode garantir se será executado em um núcleo separado ou não.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, essas provavelmente seriam executadas em paralelo em núcleos separados, mas raramente há garantia de que esse será o caso.
Você pode usar a afinidade do encadeamento para tentar assumir algum controle sobre a alocação de um núcleo para um determinado encadeamento.
Considere também planejar prioridades para empilhar o deck em termos de quais threads devem ser totalmente paralelos e quais podem esperar.
fonte