certaines applications ont plusieurs centaines de threads (sql server par exemple) qui sont gérés par l'os car le processeur lui ne peut réellement gérer que 1 thread par core logique (l'hyperthreading d'intel créé 2 cores logiques pour 1 core physique)
avoir autant de thread n'est utile que dans le cas où certains threads restent inactifs et bouclent à l'infini (comme par exemple un thread qui écoute sur le réseau, quand il n'y a rien qui arrive il ne fait rien etc...)
pour des threads de traitement avec une fin avoir plus de threads que de core peut ralentir l'exécution, typiquement avoir une collection de 1000 éléments, avoir 100 threads de 10 éléments va ralentir car l'os doit décharger et recharger les données des threads dans les cores
avec 4 cores et donc 4 threads qui vont traiter 250 éléments ca pourrait être le plus optimal, si toutefois on ne tiens pas compte que d'autres processus ont besoin des threads, mais on peut en faire abstraction ^^
on peut donc lancer x threads selon le nombres de cores (propriété cité dans mon précédent message)
quand on a besoin d'un thread par objet, la classe threadpool peut être utile, c'est elle qui s'occupe de "démarrer" un thread quand un se finit, maintenant le nombre de thread actif à la limite qu'on lui fixe
j'ai mis "démarer" car les threads ne sont pas instanciés réellement je pense, mais plutot repris du pool gagnant ainsi un peu de temps
le composant backgroundworker est aussi une classe pratique pour du multithreading, elle possède des évènements qui reviennent sur le thread principal, permettant de modifier l'interface graphique
un exemple pour des threads qui doivent chacun gérer 100 éléments d'une collection de 400 éléments (il convient de rendre ca dynamique)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| private _DicoIndexCollectionParThread as dictionary(of thread, integer)
private sub StartThreads
for i as integer = 0 tp 3
dim th as new thread(addressof traitement)
DicoIndexCollectionParThread.add(th, i*100)
th.Start
next
end sub
private sub traitement
dim depart as integer = DicoIndexCollectionParThread (System.Threading.Thread.CurrentThread)
for i as integer = depart to depart + 99
traitement sur collection(i)
next
end sub |
à noter aussi que le framework 4 dispose des boucles paralleles que je ne connais pas mais qui si j'ai bien compris s'écrit à peu près comme ca
parallel.foreach(collection)
qui il me semble créé un nombre de thread équivalent au nombres de cores dispos et chaque thread traite un élément de la collection, puis en prend un autre quand il a fini
Partager