Wielowątkowość w C# część 1

Wielowątkowość w C# część 1
16 maja, 2020 No Comments programowanie admin

Wielowątkowość pozwala na zwiększenie responsywności oraz wydajności aplikacji poprzez zrównoleglenie wykonywanych operacji. Co prawda nie jest to optymalna definicja wielowątkowości, niemniej jednak wystarczająca na potrzeby tego wpisu. Procesor potrafi wykonywać tylko jedną operację w danym momencie ale nawet na procesorze jednordzeniowym można uzyskać „wrażenie wielowątkowości” dzięki temu, że system operacyjny zarządza zasobami przydzielając na przemian wszystkim procesom pewien fragment czasu na wykonanie operacji.

Klasą, która reprezentuje zarządzalny wątek jest Thread z przestrzeni nazw System.Threading. Używając obiektów tej klasy mamy największą kontrolę nad tym jak zachowuje się nasz wątek. Obecnie do tworzenia aplikacji wielowątkowych Microsoft zaleca używanie zestawów klas TPL (TASK PARALLEL LIBRARY) i w zdecydowanej większości aplikacji sięganie bezpośrednio do klasy reprezentującej wątek nie będzie potrzebne , jednak w tym wpisie zajmiemy się wątkiem na najniższym poziomie dostępnym na platformie .NET

Ogólnie typy wątków możemy podzielić na „wątki główne(foreground)” i „wątki tła(background)”. Różnica pomiędzy w/w trybami działania jest w zasadzie tylko jedna – program nie oczekuje na zakończenie „wątku tła”. Co to znaczy w praktyce? Jeśli uruchomimy wątek jako „wątek tła” to po zakończeniu wszystkich operacji w wątkach głównych nasz program nie będzie czekał aż „wątek tła” zakończy swoją pracę ale natychmiast zakończy działanie programu. Za ustawienie wątku w odpowiednim trybie odpowiada właściwość IsBackground, która domyślnie przyjmuje wartość false co oznacza, że wszystkie nowe wątki utworzone za pomocą obiektu klasy Thread są typu foreground.

W powyższym przykładzie został utworzony „wątek tła”. Po uruchomieniu możemy zauważyć, że jeśli pętla for

uruchomiona w programie głównym, który również jest „wątkiem głównym” zakończy swoje działanie to cały program również się zakończy.

Zmieniając właściwość IsBackground na false zachowanie programu zmieni się w bardzo subtelny sposób.

Dzięki tej drobnej zmianie, program nie kończy swojego działania mimo zakończenia wykonywania pętli for w wprogramie, który jest również wątiem głównym a czeka aż utworzony przez nas równoległy „wątek główny – FirstThrid” zakończy swoją pracę.

W jaki sposób podjąć decyzję kiedy używać „wątków głównych” a kiedy „wątków tła”? Podczas wyboru trzeba zadać sobie pytanie czy operacja którą wykonuje wątek może zostać przerwana bez konsekwencji w dowolnym momencie? Jeśli tak to wątek możemy uruchomić jako „wątek tła”.

To wszystko w pierwszym wpisie. Zachęcam do śledzenia strony. W naszych wpisach będziemy się starali w jak najprostszy sposób przedstawiać zagadnienia z dziedziny programowania.

Tags
O autorze