Wprowadzenie do wątków w języku Visual Basic

Aby zrozumieć wątki w VB.NET, pomaga zrozumieć niektóre podstawowe koncepcje. Po pierwsze, wątki to coś, co dzieje się, ponieważ system operacyjny to obsługuje. Microsoft Windows to wyprzedzający wielozadaniowy system operacyjny. Część systemu Windows o nazwie harmonogram zadań rozdziela czas procesora na wszystkie działające programy. Te małe fragmenty czasu procesora nazywane są przedziałami czasu. Programy nie decydują o tym, ile czasu procesora otrzymują. Ponieważ te przedziały czasowe są tak małe, masz złudzenie, że komputer robi kilka rzeczy na raz.

Definicja wątku

Wątek to pojedynczy sekwencyjny przepływ kontroli.

Niektóre kwalifikatory:

  • Wątek jest „ścieżką wykonania” przez ten kod.
  • Wątki dzielą pamięć, więc muszą współpracować, aby uzyskać poprawny wynik.
  • Wątek zawiera dane specyficzne dla wątku, takie jak rejestry, wskaźnik stosu i licznik programu.
  • Proces jest pojedynczą częścią kodu, która może mieć wiele wątków, ale ma co najmniej jeden i ma jeden kontekst (przestrzeń adresowa).

Są to rzeczy na poziomie asemblera, ale do tego się angażujesz, kiedy zaczynasz myśleć o wątkach.

instagram viewer

Wielowątkowość vs. Wieloprocesowe

Wielowątkowość to nie to samo, co równoległe przetwarzanie wielordzeniowe, ale wielowątkowość i wieloprocesowość działają razem. Większość komputerów dzisiaj ma procesory, które mają co najmniej dwa rdzenie, a zwykłe komputery domowe czasami mają nawet osiem rdzeni. Każdy rdzeń jest osobnym procesorem, zdolnym do samodzielnego uruchamiania programów. Zwiększenie wydajności uzyskuje się, gdy system operacyjny przypisuje inny proces do różnych rdzeni. Używanie wielu wątków i wielu procesorów dla jeszcze większej wydajności nazywa się równoległością na poziomie wątków.

Wiele tego, co można zrobić, zależy od tego, co może zrobić system operacyjny i sprzęt procesora zawsze to, co możesz zrobić w swoim programie, i nie powinieneś oczekiwać, że będziesz mógł używać wielu wątków wszystko. W rzeczywistości może nie być wielu problemów korzystających z wielu wątków. Nie wdrażaj wielowątkowości tylko dlatego, że tam jest. Możesz łatwo zmniejszyć wydajność programu, jeśli nie jest dobrym kandydatem do wielowątkowości. Przykładowo, kodeki wideo mogą być najgorszymi programami do wielowątkowości, ponieważ dane są z natury rzeczy seryjny. Programy serwerowe obsługujące strony internetowe mogą być jednymi z najlepszych, ponieważ różni klienci są z natury niezależni.

Ćwiczenie bezpieczeństwa wątków

Kod wielowątkowy często wymaga złożonej koordynacji wątków. Subtelne i trudne do znalezienia błędy są powszechne, ponieważ różne wątki często muszą współużytkować te same dane, aby dane mogły być zmieniane przez jeden wątek, gdy inny go nie oczekuje. Ogólny termin na ten problem to „stan wyścigu”. Innymi słowy, dwa wątki mogą wejść w „wyścig”, aby zaktualizować te same dane, a wynik może być różny w zależności od tego, który wątek „wygrywa”. Jako trywialny przykład załóżmy, że kodujesz pętlę:

Jeśli licznik pętli „I” nieoczekiwanie pominie liczbę 7 i zmieni liczbę z 6 na 8 - ale tylko przez pewien czas - miałoby to katastrofalny wpływ na wszystko, co robi pętla. Zapobieganie takim problemom nazywa się bezpieczeństwem wątków. Jeśli program potrzebuje wyniku jednej operacji w późniejszej operacji, kodowanie równoległych procesów lub wątków może być niemożliwe.

Podstawowe operacje wielowątkowe

Czas odsunąć to ostrzeżenie ostrożnościowe na drugi plan i napisać kod wielowątkowy. W tym artykule dla uproszczenia zastosowano teraz aplikację konsolową. Jeśli chcesz kontynuować, uruchom program Visual Studio z nowym projektem aplikacji konsolowej.

Podstawową przestrzenią nazw używaną przez wielowątkowość jest System. Przestrzeń nazw wątków i klasa Thread utworzą, uruchomią i zatrzymają nowe wątki. W poniższym przykładzie zauważ, że TestMultiThreading jest delegatem. Oznacza to, że musisz użyć nazwy metody, którą może wywołać metoda Thread.

W tej aplikacji moglibyśmy wykonać drugi Sub, po prostu nazywając go:

Spowodowałoby to wykonanie całej aplikacji w sposób szeregowy. Pierwszy przykład kodu powyżej uruchamia podprogram TestMultiThreading, a następnie kontynuuje.

Przykład algorytmu rekurencyjnego

Oto aplikacja wielowątkowa polegająca na obliczaniu permutacji tablicy za pomocą algorytmu rekurencyjnego. Nie pokazano tutaj całego kodu. Tablica permutowanych znaków to po prostu „1”, „2”, „3”, „4” i „5.” Oto istotna część kodu.

Zauważ, że istnieją dwa sposoby wywołania podrzędnego elementu Permute (oba zostały skomentowane w powyższym kodzie). Jeden rozpoczyna wątek, a drugi wywołuje go bezpośrednio. Jeśli zadzwonisz bezpośrednio, otrzymasz:

Jeśli jednak wyrzucisz wątek i zamiast tego uruchomisz element Permute, otrzymasz:

To wyraźnie pokazuje, że generowana jest co najmniej jedna permutacja, a następnie podrzędny główny przesuwa się do przodu i kończy, wyświetlając „Zakończoną główną”, podczas gdy reszta permutacji jest generowana. Ponieważ wyświetlacz pochodzi z drugiego podrzędnego wywołanego przez podrzędny Permute, wiesz, że jest to również część nowego wątku. To ilustruje koncepcję, że wątek jest „ścieżką wykonania”, jak wspomniano wcześniej.

Przykład warunków wyścigu

Pierwsza część tego artykułu wspomniała o stanie wyścigu. Oto przykład, który pokazuje to bezpośrednio:

Okno natychmiastowe pokazało ten wynik w jednej próbie. Inne próby były inne. To esencja warunków wyścigu.

instagram story viewer