Quando você inicia vários encadeamentos em um processador multi-core, eles têm garantia de serem processados por diferentes núcleos?

21

Eu tenho um processador Pentium Core i5, que tem 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 são garantidos para serem executados em núcleos separados?

    
por developer747 07.06.2013 / 20:31

2 respostas

18

Você não pode garantir em .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 (!) .

Isso ocorre porque os threads gerenciados não são os mesmos que os threads do SO - um único segmento gerenciado pode usar vários segmentos do SO para suportá-lo. Em C #, você só lida diretamente com Thread s gerenciado (pelo menos, sem recorrer a p / invoke para chamar as funções de encadeamento WinAPI, o que você nunca deve fazer) .

No entanto, os agendadores de threads do .Net e do 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.

    
por 07.06.2013 / 22:30
15

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

Você pode usar a afinidade de thread para tentar levar alguns controle sobre a alocação de um núcleo para um determinado segmento.

Considere também as prioridades de agendamento para empilhar o baralho em termos de quais segmentos devem ser inteiramente paralelos e quais podem esperar.

    
por 07.06.2013 / 20:38