Pracuję nad aplikacją do odtwarzania muzyki.
Podczas odtwarzania często rzeczy muszą się dziać na osobnych wątkach, ponieważ muszą zdarzyć się jednocześnie. Na przykład, nuty potrzeby akordów do bycia wysłuchanym razem, więc każdy ma przydzielony własny wątek, aby być odtwarzane w (Edit wyjaśnienie. Wywołujący note.play()
zawiesza wątek aż notatka jest gotowe do gry, a to dlatego, że potrzebne są trzy oddzielne wątki, aby jednocześnie usłyszeć trzy nuty).
Ten rodzaj zachowania tworzy wiele wątków podczas odtwarzania utworu muzycznego.
Rozważmy na przykład utwór muzyczny z krótką melodią i krótką sekwencją akordów. Całą melodię można odtwarzać w jednym wątku, ale progresja wymaga trzech wątków, ponieważ każdy z jej akordów zawiera trzy nuty.
Tak więc pseudo-kod do odtwarzania progresji wygląda następująco:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
Zakładając, że progresja ma 4 akordy i gramy dwa razy, niż otwieramy 3 notes * 4 chords * 2 times
= 24 wątki. A to tylko raz.
Właściwie to działa dobrze w praktyce. Nie zauważam żadnych zauważalnych opóźnień ani wynikających z tego błędów.
Ale chciałem zapytać, czy to jest poprawna praktyka, czy też robię coś zasadniczo nie tak. Czy rozsądne jest tworzenie tak wielu wątków za każdym razem, gdy użytkownik naciska przycisk? Jeśli nie, jak mogę to zrobić inaczej?
Is it reasonable to create so many threads...
zależy od modelu wątków języka. Wątki używane do równoległości są często obsługiwane na poziomie systemu operacyjnego, aby system operacyjny mógł zmapować je na wiele rdzeni. Takie wątki są kosztowne w tworzeniu i przełączaniu między nimi. Wątki dla współbieżności (przeplatanie dwóch zadań, niekoniecznie wykonywanie obu jednocześnie) mogą być implementowane na poziomie języka / maszyny wirtualnej i mogą być bardzo „tanie” w produkcji i przełączaniu się między nimi, dzięki czemu można, powiedzmy, rozmawiać z 10 gniazdami sieciowymi mniej więcej jednocześnie, ale niekoniecznie uzyskasz w ten sposób większą przepustowość procesora.