Cześć 👨💻👩💻.
Polecam przeczytać to każdemu kto chce w miarę krótko i zwięźle w jednym miejscu ugruntować swoją wiedzę / zapoznać się z podstawami – w teorii większość z nas zapewne słyszała o tematach wspomnianych w tym artykule (być może pojawiały się gdzieś na uczelni) ale wiadomo pamięć jest krótka i ulotna (coś jak L1) a jeżeli w temat się nie zagłębiliśmy to takie powtórzenie będzie jak znalzł 👌🏼.
W tym artykule:
1️⃣ dowiesz się o podstawach wielowątkowości
2️⃣ poznasz podstawowe pojęcia związane z wielowątkowością
3️⃣ usłyszysz o zaletach i wadach programowania wielowątkowego
Poświęć 5 minut i ugruntuj swoją wiedzę! 🔥👉 – ZACZYNAMY! 👊
Czym tak naprawdę jest programowanie wielowątkowe?
Być może słyszałeś o programowaniu asynchronicznym lub współbieżnym. Jeżeli tak, to czy jest to to samo co programowanie wielowątkowe? Są to terminy poniekąd bliźniacze i często mylone ale nie są tym samym. Sam wiele razy się na to nadziewałem i zawsze posiłkowałem się wujkiem google, który mi podpowiadał co jest co. Więc czym jest to całe programowanie wielowątkowe? Swoimi słowami jest to możliwość jednoczesnego wykonywania wielu zadań. A słowami z wikipedii (które moim zdaniem fajnie i zwięźle to definiują)
Wielowątkowość (ang. multithreading) – cecha systemu operacyjnego, dzięki której w ramach jednego procesu może być wykonywanych kilka zadań nazywanych wątkami. Nowe zadania to kolejne ciągi instrukcji realizowane do pewnego stopnia niezależnie. Wszystkie wątki (zadania) w ramach tego samego procesu współdzielą tą samą wirtualną przestrzeń adresową zawierającą kod programu i jego dane.
Czyli chodzi o to, że umożliwiamy komputerowi wykonanie wielu zadań jednocześnie.
Wyobraź sobie restaurację w której serwowana jest głównie jajecznica i tosty francuskie.
Proces przygotowania jest prosty (w wersji poniżej jest jeszcze bardziej uproszczony niż ma to miejsce w rzeczywistości):
1 2 3 4 | Rozbijasz jajka Smażysz jajka na patelni Przygotowujesz chleb tostowy Smażysz chleb na patelni |
Czyli tak właściwie cały proceś można podzielić na dwie części
1 2 | Przygotowanie jajecznicy Przygotowanie tostów francuskich |
I teraz, w wersji jednowątkowej, czyli tak jak pracuje 90% z nas (bo nie mamy potrzeby aby dodatkowo komplikować kod – TAK, kod wielowątkowy zmniejsza czytelność kodu), będzie to wyglądało w taki sam sposób jak powyżej. Na początku przygotuję sobie jajecznicę a następnie zajmę się tostami. Wyglądałoby to mniejwięcej tak:
gdzie T1 to wątek na którym wykonuje się praca. Możemy sobie wyobrazić, że T1 jest kucharzem w restauracji, który przygotowuje nasze danie. Ale teraz pojawia się problem. Restauracja ma tyle klientów, że jeden kucharz nie nadąża wykonywać swojej pracy, czego rezultatem jest długie oczekiwanie na jajecznicę z tostami. Co robi szef restauracji? Zatrudnia drugiego kucharza! Teraz jeden z nich zajmuje się wyłącznie przygotowywaniem jajecznicy a drugi przygotowywaniem tostów.
Tak prezentuje się wersja wielowątkowa. A więc wątki to tak naprawdę pracownicy (workers). My, czyli Ci którzy je zatrudniają (tworzą), zlecamy im konkretne zadania (taski) do wykonania. Najprostszym językiem tak właśnie ma się sprawa wielowątkowości w programowaniu. Oczywiście przykład wyżej jest bardzo uproszczony – nie mamy tutaj problemu ze wspólnym dostępem do pamięci czy też zakleszczeniami wątków – zadanie z jednego wątku nie jest powiązane z zadaniem z wątku drugiego lub – jeżeli wolisz analogię – kucharza 1 nie obchodzi zadanie jakie wykonuje kucharz 2 i odwrotnie.
Zalety i wady programowania wielowątkowego (z punktu widzenia developera)
Zalety:
- zwiększona wydajność aplikacji
- zazwyczaj są to ciekawe / skomplikowane zadania (uznaję to za zaletę bo odbiega od typowego klepania kodu)
Wady:
- kod trudniejszy do zrozumienia
- debugowanie jest skomplikowane
- trudny do testowania
- trudniejszy do napisania 🙂
Podsumowanie
Uważam, że pisanie kodu wielowątkowego jest trudne i tylko programiści z doświadczeniem powinni się zabierać za pisaniego takiego kodu. Ba.. mało tego! Nie wszyscy programiści rozumieją ideę programowania wielowątkowego! Czy to oznacza, że nie powinniśmy pisać kodu działającego na wielu wątkach? To zależy :). Napewno nie powinieneś pisać kodu produkcyjnego ale gdzieś trzeba zacząć i od tego są właśnie jakieś projekty poboczne. To tam jest miejsce do nauki. Później życie zweryfikuje czy przyda nam się ta umiejętność (lepiej umieć niż nie umieć).
Inspirację brałem ze źródła poniżej. Bardzo polecam przeczytać zwłaszcza jeżeli programujesz w Javie: