J'ai un processeur Pentium core i5, qui a 4 cœurs. Si je fais cela dans un programme de console C #
var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
les threads t1 et t2 sont-ils garantis pour fonctionner sur des cœurs séparés?
t1
ett2
est exécuté à différents moments dans un ordre arbitraire (par exemple, il est possible det2
démarrer avantt1
dans certains modèles).Réponses:
Vous ne pouvez pas garantir dans .Net que deux
Thread
s s'exécutent sur deux cœurs distincts. En fait, vous ne pouvez pas non plus garantir que l'unThread
fonctionnera sur un seul cœur (!) .Cela est dû au fait que les threads gérés ne sont pas identiques aux threads du système d'exploitation - un seul thread géré peut utiliser plusieurs threads du système d'exploitation pour le prendre en charge. En C #, vous ne traitez que directement avec les
Thread
s gérés (au moins, sans recourir à p / invoke pour appeler les fonctions de threading WinAPI, ce que vous ne devriez jamais faire) .Cependant, les planificateurs de threads .Net et Windows sont très bons dans ce qu'ils font - ils n'exécuteraient pas deux threads sur un seul cœur tandis qu'un deuxième cœur est complètement inactif. Donc, en général, vous n'avez pas à vous en préoccuper.
la source
Thread
s sont des fils OS. Mais ce n'est pas pourquoi il n'y a aucune garantie qu'un seul thread s'exécutera toujours sur le même noyau.async
mot-clé (qui est ce dont je suppose que vous parlez, car les "threads asynchrones" est redondant) est juste du sucre syntaxique pour utiliser unBackgroundWorker
thread, qui est comme n'importe quel autre thread .Net - vous ne pouvez pas garantir qu'il fonctionnera sur un noyau séparé ou non.Non, le système d'exploitation et le processeur décideront quoi exécuter et quand. dans l'exemple simple que vous avez montré, à l'exclusion d'autres tâches, oui, celles-ci s'exécuteraient très probablement en parallèle sur des cœurs séparés, mais il est rarement garanti que ce sera le cas.
Vous pouvez utiliser l' affinité de thread pour tenter de prendre un certain contrôle sur l'allocation d'un noyau à un thread donné.
Pensez également à planifier les priorités pour empiler le jeu en fonction des threads qui doivent être entièrement parallèles et de ceux qui peuvent attendre.
la source