Sto lavorando a un'applicazione che riproduce musica.
Durante la riproduzione, spesso devono succedere cose su thread separati perché devono accadere simultaneamente. Ad esempio, le note di un accordo devono essere ascoltate insieme, quindi a ognuno viene assegnato il proprio thread per essere suonato. (Modifica per chiarire: la chiamata note.play()
congela il thread fino a quando la nota non viene suonata, ed è per questo che ho bisogno di tre thread separati per ascoltare tre note contemporaneamente.)
Questo tipo di comportamento crea molti thread durante la riproduzione di un brano musicale.
Ad esempio, considera un brano musicale con una breve melodia e una breve progressione di accordi di accompagnamento. L'intera melodia può essere suonata su un singolo thread, ma la progressione ha bisogno di tre thread per suonare, poiché ciascuno dei suoi accordi contiene tre note.
Quindi lo pseudo-codice per riprodurre una progressione è simile al seguente:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
Supponendo quindi che la progressione abbia 4 accordi, e la suoniamo due volte, quindi stiamo aprendo 3 notes * 4 chords * 2 times
= 24 thread. E questo è solo per giocarci una volta.
In realtà, funziona bene in pratica. Non noto alcuna latenza evidente o bug derivanti da questo.
Ma volevo chiedere se questa è una pratica corretta o se sto facendo qualcosa di fondamentalmente sbagliato. È ragionevole creare così tanti thread ogni volta che l'utente preme un pulsante? In caso contrario, come posso fare diversamente?
Is it reasonable to create so many threads...
dipende dal modello di threading della lingua. I thread utilizzati per il parallelismo sono spesso gestiti a livello di sistema operativo in modo che il sistema operativo possa mapparli su più core. Tali thread sono costosi da creare e passare da uno all'altro. I thread per la concorrenza (interleaving di due attività, non necessariamente eseguendo entrambi contemporaneamente) possono essere implementati a livello di lingua / VM e possono essere resi estremamente "economici" per produrre e alternare in modo da poter dire, per esempio, parlare con 10 socket di rete più o meno contemporaneamente, ma non otterrai necessariamente una maggiore velocità della CPU in quel modo.