Większość powyższych odpowiedzi dotyczy wydajności i jednoczesnego działania. Podejdę do tego z innego punktu widzenia.
Weźmy przykład, powiedzmy, uproszczonego programu do emulacji terminala. Musisz wykonać następujące czynności:
- uważaj na znaki przychodzące ze zdalnego systemu i wyświetl je
- uważaj na rzeczy pochodzące z klawiatury i wyślij je do zdalnego systemu
(Prawdziwe emulatory terminali robią więcej, w tym potencjalnie wyświetlają echo rzeczy, które wpisujesz na wyświetlaczu, ale na razie to pominiemy).
Teraz pętla do odczytu z pilota jest prosta, zgodnie z następującym pseudokodem:
while get-character-from-remote:
print-to-screen character
Pętla do monitorowania klawiatury i wysyłania jest również prosta:
while get-character-from-keyboard:
send-to-remote character
Problem polega jednak na tym, że musisz to robić jednocześnie. Kod musi teraz wyglądać bardziej tak, jeśli nie masz wątków:
loop:
check-for-remote-character
if remote-character-is-ready:
print-to-screen character
check-for-keyboard-entry
if keyboard-is-ready:
send-to-remote character
Logika, nawet w tym celowo uproszczonym przykładzie, który nie bierze pod uwagę złożoności komunikacji w świecie rzeczywistym, jest dość zaciemniona. Jednak w przypadku wątków, nawet na jednym rdzeniu, dwie pętle pseudokodów mogą istnieć niezależnie bez przeplatania ich logiki. Ponieważ oba wątki będą w większości związane z operacjami we / wy, nie obciążają one procesora, nawet jeśli, ściśle mówiąc, marnują zasoby procesora bardziej niż zintegrowana pętla.
Oczywiście użycie w świecie rzeczywistym jest bardziej skomplikowane niż powyższe. Jednak złożoność zintegrowanej pętli rośnie wykładniczo w miarę dodawania kolejnych problemów do aplikacji. Logika staje się coraz bardziej fragmentaryczna i musisz zacząć używać technik takich jak automaty stanowe, procedury itp., Aby uzyskać możliwość zarządzania. Zarządzalne, ale nieczytelne. Wątkowanie sprawia, że kod jest bardziej czytelny.
Dlaczego więc nie miałbyś używać wątków?
Cóż, jeśli twoje zadania są związane z procesorem zamiast we / wy, wątkowanie w rzeczywistości spowalnia system. Wydajność ucierpi. W wielu przypadkach. („Thrashing” to częsty problem, jeśli porzucisz zbyt wiele wątków związanych z procesorem. W efekcie spędzasz więcej czasu na zmienianiu aktywnych wątków niż na uruchamianiu zawartości samych wątków). tak proste jest to, że celowo wybrałem uproszczony (i nierealistyczny) przykład. Jeśli chcesz powtórzyć to, co zostało wpisane na ekranie, masz nowy świat bólu, gdy wprowadzasz blokowanie współdzielonych zasobów. Mając tylko jeden wspólny zasób, nie stanowi to większego problemu, ale zaczyna stawać się coraz większym problemem, ponieważ masz więcej zasobów do udostępnienia.
Ostatecznie tworzenie wątków dotyczy wielu rzeczy. Na przykład chodzi o to, aby procesy związane z we / wy były bardziej responsywne (nawet jeśli ogólnie były mniej wydajne), jak niektórzy już powiedzieli. Chodzi także o ułatwienie logiki (ale tylko wtedy, gdy zminimalizujesz stan współdzielenia). Chodzi o wiele rzeczy i musisz zdecydować, czy jego zalety przeważają nad wadami w każdym przypadku z osobna.