Je travaille sur une application qui joue de la musique.
Pendant la lecture, souvent, les choses doivent se produire sur des threads séparés car elles doivent se produire simultanément. Par exemple, les notes d'un besoin d'accord pour être entendues ensemble, de sorte que chacun se voit attribuer son propre fil à jouer dans (Edit pour clarifier:. Appel note.play()
gèle le fil jusqu'à ce que la note est fini de jouer, ce qui est la raison pour laquelle j'ai besoin de trois fils séparés pour entendre trois notes en même temps.)
Ce type de comportement crée de nombreux threads lors de la lecture d'un morceau de musique.
Par exemple, considérons un morceau de musique avec une courte mélodie et une courte progression d'accords d'accompagnement. La mélodie entière peut être jouée sur un seul fil, mais la progression a besoin de trois fils pour jouer, puisque chacun de ses accords contient trois notes.
Ainsi, le pseudo-code pour jouer une progression ressemble à ceci:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
Donc, en supposant que la progression a 4 accords et que nous la jouons deux fois, nous ouvrons 3 notes * 4 chords * 2 times
= 24 threads. Et c'est juste pour y jouer une fois.
En fait, cela fonctionne bien dans la pratique. Je ne remarque aucune latence notable, ni aucun bogue en résultant.
Mais je voulais demander si c'était la bonne pratique, ou si je fais quelque chose de fondamentalement mauvais. Est-il raisonnable de créer autant de threads chaque fois que l'utilisateur appuie sur un bouton? Sinon, comment puis-je procéder différemment?
Is it reasonable to create so many threads...
dépend du modèle de threading de la langue. Les threads utilisés pour le parallélisme sont souvent gérés au niveau du système d'exploitation afin que le système d'exploitation puisse les mapper sur plusieurs cœurs. Ces threads sont coûteux à créer et à basculer. Les threads pour la simultanéité (entrelacement de deux tâches, n'exécutant pas nécessairement les deux simultanément) peuvent être implémentés au niveau de la langue / machine virtuelle et peuvent être rendus extrêmement «bon marché» pour produire et basculer entre vous afin, par exemple, de parler à 10 sockets réseau plus ou moins simultanément, mais vous n'obtiendrez pas nécessairement plus de débit CPU de cette façon.