Funkcje C ++ stdthread

Funkcje C ++ stdthread
Pojedynczy strumień sekwencji procesu można nazwać wątkiem. Wątki są często określane jako „lekkie procesy”, ponieważ mają pewne cechy z procesami. Klasa ma reprezentować wyraźne wątki wykonania. Pojedynczy wątek wykonania jest reprezentowany przez wątek klasowy. Wiele funkcji może działać jednocześnie z powodu wątków. Po utworzeniu obiektu wątku, natychmiast zaczyna wykonywać (z zastrzeżeniem opóźnienia planowania systemu operacyjnego), zaczynając od najwyższej funkcji określonej jako konstruktor funkcji. Zdefiniowana wartość metody jest pomijana, a std :: kończy się, jeśli wyjdzie z powodu podnoszenia błędu.

Rodzaje wątków

Szczególny strumień serii procesu jest określany jako wątek. Wątki są oznaczone jako niezbędne procedury, ponieważ są one podobne do procesów na wiele sposobów. Chociaż wątki są obsługiwane sekwencyjnie, wydaje się, że działają jednocześnie. Istnieją różne stany dla każdego wątku.

  • licznik elektroniczny
  • Zestaw rejestrów
  • obszar półki

Procesy

Zasadniczo procesy to programy wysyłane ze stanu gotowego i zaplanowane do wykonania w procesorze. Koncepcja procesu jest przechowywana przez PCB (blok kontroli procesu). Proces może wytworzyć coś, co nazywa się „procesami dziecięcymi” lub nowych procesów. Proces trwa dłużej, ponieważ jest izolowany, co oznacza, że ​​nie udostępnia pamięci z żadnymi innymi procesami. Każdy z poniższych stanów procesu może być obecny: nowy, gotowy, uruchamiany, czekający, zakończony lub zawieszony.

Wątki

Wątek jest modułem procesu. Proces może mieć kilka wątków, a wszystkie te wątki są zawarte w metodzie. Istnieją trzy stany dla wątku: Uruchomienie, gotowe i zablokowane. Wątek kończy się szybciej niż proces, ale nie izoluje się tak, jak proces.

Wspólne cechy między wątkami a procesami obejmują

  • Tylko jeden wątek lub proces może działać jednocześnie.
  • Kolejne wykonanie w procesie.
  • Zdolność do generowania dzieci.

Rozróżnienia między procesami a wątkiem

  • Procesy są samoregulacyjne; wątki nie są.
  • Chociaż procesy mogą, ale nie muszą, pomagać sobie nawzajem, wątki są do tego zaprojektowane.

Wątek na poziomie użytkownika

Jest w praktyce w bibliotece na poziomie użytkownika; Wezwania systemowe nie są używane do ich konstruowania. Przełączanie wątków nie wymaga połączenia systemu operacyjnego ani przerwania jądra. Jądro zarządza nimi tak, jakby były procesami jednoosobowymi, ponieważ nie jest świadome wątku na poziomie użytkownika.

Korzyści

  • Jedynymi atrybutami wątku to przestrzeń stosu, wskaźnik stosu i rejestr zmiany.
  • Ponieważ jądro nie dokonuje dostosowań, tworzenie jest proste.
  • Z powodu braku wywołania systemu operacyjnego przełączanie wątków jest szybkie.
  • Jest kompatybilny z systemami operacyjnymi, które zabraniają wielokrotności.

Wątek na poziomie jądra

Wątki są zarządzane przez jądro. Ponadto jądro śledzi również procesy za pomocą konwencjonalnej tabeli procesów. Kernel OS ma wezwania systemowe do zarządzania i tworzenia wątków.

Korzyści

  • Biorąc pod uwagę, że jądro ma pełne informacje o wątkach systemu.
  • Harmonogram może zdecydować o podaniu procesów o dużej liczbie wątków dodatkowych czasu.
  • Dobre do regularnego blokowania programów.

Multi-Threading:

Inną nazwą wątku jest lekki proces. Przebijając proces na kilka wątków, należy osiągnąć równoległość. Na przykład wiele kart w przeglądarce może reprezentować różne wątki. Wiele wątków jest używanych przez MS Word, w tym jeden do przetwarzania wejść, a drugi do formatowania tekstu.

Zdefiniuj funkcję wątku ()

Wątek klasowy odnosi się do konkretnego wątku implementacji. W C ++ termin „klasa wątków” odnosi się do klasy STD ::. Po utworzeniu obiektu połączonych wątków, metodą najwyższego poziomu, która została dostarczona jako część umowy konstruktora funkcji. Kod implementacyjny, który musi zostać wywołany, odbędzie nowy obiekt wątku, który został utworzony, aby uruchomić wątek.

Jak powiedziano wcześniej, STD :: Wątek jest wymagany, aby rozpocząć nowy wątek, a wątek musi być również możliwy do nazywania. Zwolenie to program, który należy uruchomić, gdy wątek jest aktywny. Innymi słowy, jeśli wymagany jest nowy wątek, należy dostarczyć do konstruktora obiektu dla std ::. Następnie rozpoczyna się nowo wygenerowany wątek i uruchomiona jest funkcja dostarczona.

Procesy vs wątki

Główne rozróżnienie polega na tym, że podczas gdy procesy działają w różnych obszarach pamięci, wątki w jednym procesie współużytkowana przestrzeń pamięci. Ponieważ wątki nie są od siebie całkowicie niezależne, takie jak procesy, udostępniają swoje zasoby systemu operacyjnego, sekcję kodu i sekcją danych z innymi wątkami.

Wątki mają zalety w zakresie procesów

  • Reaktywność: jeśli proces zostanie podzielony na wiele wątków, wyjście każdego wątku można zwrócić, gdy tylko zakończy się uruchomienie.
  • Szybszy przełącznik kontekstowy: Przełączniki kontekstowe między wątkami występują szybciej niż przełączniki kontekstowe w procesie. CPU musi zrobić więcej kosztów ogólnych ze względu na zmiany kontekstowe przetwarzania.
  • Skuteczne zastosowanie systemu wieloprocesorowego: Jeśli proces zawiera wiele wątków, możemy zaplanować te wątki na różnych procesorach. W rezultacie byłoby to szybsze wykonanie procesu.
  • Komunikacja ułatwia fakt, że kilka wątków ma miejsce. W trakcie trwania musimy przestrzegać konkretnej metody komunikacji w zakresie komunikacji z dwoma procesami.
  • Udostępnianie zasobów: wszystkie wątki w procesie mogą udostępniać zasoby, takie jak kod, dane i pliki.
  • Zwiększona pojemność systemu: Gdy zadanie jest podzielone na kilka wątków, każda operacja wątku jest traktowana jako funkcja, zwiększając liczbę metod wykonanych w danym czasie, zwiększa pojemność systemu.

Funkcja wątku w C++

W systemie operacyjnym dostarczają (wątek POSIX) dla funkcji, funkcje związane z funkcjami. W ten sposób możemy zrobić wiele wątków do obsługi współbieżnego przepływu procesu. Działa najlepiej w systemach z kilkoma procesorami lub rdzeniami, w których szybkość wykonania można osiągnąć, wdrażając wątki na poziomie jądra. Zyski można również osiągnąć w systemach z jednym procesorem, korzystając z IO lub innych usług systemowych, które mają tendencję do zatrzymywania procesów.

Utwórz funkcję ()

pthread_create: Nowy wątek Utwórz

Parametry

  • Wątek: Wskaźnik do wartości całkowitej niepodpisanej, która zawiera identyfikator wątku najnowszego wątku, który został uruchomiony.
  • ATTR: Atrybuty wątku, takie jak jego stan wolnostojący, strategia planowania, adres stosu itp., są zdefiniowane przez strukturę zwaną attr. Dla domyślnych właściwości wątków, ustaw na null.
  • Rozpocznij rutynę: wskaźnik do początkowego podprogramu wątku. Funkcja ma tylko jeden atrybut, ale struktura musi być używana, jeśli do funkcji musi być dostarczona więcej niż jedna wartość.
  • Arg: wskaźnik do pustki, która zawiera wskaźnik do parametrów funkcji, zgodnie z poprzednim argumentem.

Funkcja exit ()

pthread_exit: używany do przestania używać wątku

Parametry
Ujawnij, wskaźnik całkowitej liczby całkowitej zawierającej status powrotu wątku jest wymaganym parametrem dla tej procedury. Każdy wątek czekający na dołączenie do tego wątku musi być w stanie wyświetlić status powrotu, ponieważ zakres tej zmiennej musi być globalny.

Funkcja łączenia ()

pthread_join: używane do wyjścia z oczekiwania wątku

Parametry

  • TH: wątek czeka na identyfikator wątku.
  • Powrót wątku: wskaźnik do miejsca, w którym zapisano wątek opisany w stanie wyjścia.

Equal () funkcja

pthread_equal: Określa, czy dwa wątki są podobne. Funkcja zwraca liczbę niezerową, jeśli dwa wątki są równe, w przeciwnym razie zero.

ST :: Tworzenie wątków

W C ++ wątki są budowane przy użyciu klasy STD ::. Wątek jest unikalnym przepływem wykonania; Jest podobny do posiadania pomocnika, kończąc jedno zadanie, gdy kończysz kolejny jednocześnie. Po wykonaniu całego kodu wątku, zatrzymuje się. Podczas ustanawiania wątku należy przekazać coś, aby wykonać na nim. Obiekty wymienione poniżej można przekazać do wątku.

Typy członków

ID: ID wątku (publiczny)
Norty_handle_type: indement_handle_type (publiczne)

Wątek umożliwia jednoczesne wykonywanie wielu zadań. W C ++ termin „klasa wątków” odnosi się do klasy STD ::. Nowy obiekt wątku musi zostać wygenerowany, aby uruchomić wątek i musi być dostarczony do kodu wykonywania, który należy wywołać. Metodą najwyższego poziomu, która została dostarczona jako część umowy konstruktora funkcji, jest miejsce, w którym wykonanie wątku rozpoczyna się po utworzeniu obiektu połączonego wątku.

Przy użyciu obiektu przy użyciu

Obiekt może być wyświetlany, używając tej metody. W tym celu wymagana jest klasa, a operator () musi zostać przeciążony w tej klasie. Oprogramowanie, które musi działać po utworzeniu wątku, jest zawarte w przeciążonych metodach.

Przywoływając się do wskaźnika

Wskaźnik zostanie uznany za pomocą tej metody. W obiekcie wątku lista parametrów lub argumentów wysłanych do metody pojawia się obok nazwy funkcji.

Przy użyciu wskaźnika funkcji

Dawanie go do obiektu wątku do wykonania osiąga pożądany wynik. Konstruktor funkcji obiektu wątku odbiera wyrażenie Lambda o nazwie „LM” jako swój pierwszy argument przed otrzymaniem jego argumentów jako drugiego argumentu.

Omówmy różne przykłady funkcji STD ::.

Przykład 1

W tym przypadku użyjemy wątku z wskaźnikiem.

#włączać
#włączać
Test klasowy

publiczny:
void execute (std :: polecenie string)

dla (int i = 0; i < 8; i++)

STD :: Cout<

;
int main ()

Test * testPtr = nowy test ();
std :: wątek th (& test :: execute, testPtr, „wartości”);
th.dołączyć();
Usuń testPtr;
powrót 0;

Po pierwsze, dołączamy pliki nagłówków i w programie. Tworzymy klasę i określamy jego nazwę „test”. Następnie wykorzystujemy metodę publiczną i wykonujemy polecenie ciągu. Po wykonaniu polecenia ciągów będziemy ubiegać się o pętlę i przyrost (0 do 8). Tutaj stosujemy oświadczenie „cout”. Następnie nazywamy funkcję main (). Wraz z tym nazywamy klasą „testem” i używamy w nim wskaźnika. Następnie wątek mija wskaźnik. Następnie używamy funkcji Join (), usuwamy wskaźnik testowy i wprowadź „zwróć 0”.

Przykład 2

W takim przypadku użyjemy wątku bez wskaźnika.

#włączać
#włączać
Nazwa klasy

publiczny:
Statyczny test pustki (STD :: String Command)

dla (int i = 0; i < 3; i++)

STD :: Cout<

;
int main ()

STD :: Wątek TH (& Name :: Test, „Nazwa”);
th.dołączyć();
powrót 0;

Użyj plików nagłówka i . Utwórz klasę, a tytuł klasy to „Nazwa”. Korzystamy z metody publicznej, a następny wiersz używa funkcji statycznej członka i tutaj przekazujemy ciąg. Użyj pętli „dla”, a następnie zainicjuj wartości od 0 do 3. Oświadczenie „cout” jest używane do przedstawienia wartości. W następnym wierszu wywołujemy funkcję main (), używamy wątku i przekazujemy wartości bez użycia wskaźnika. Następnie używamy funkcji Join () i wprowadzamy „zwróć 0”.

Przykład 3

Tutaj zastosujemy operator void.

#włączać
#włączać
za pomocą przestrzeni nazw Std;
klasowe laboratorium
publiczny:
void operator () (int a)

dla (int i = 0; i < a; i++)
Cout << "Number of threads :" << i << "\n";

;
int main ()

Wątek T2 (lab (), 6);
T2.dołączyć();
powrót 0;

W tym kodzie integrujemy wymagane pliki nagłówka , . Wykorzystujemy standardową przestrzeń nazw jako STD. Dodajemy klasę o nazwie „Lab” i używamy jej metody publicznej. Następnie zastosuj operatora pustki i zainicjuj w nim zmienną „A”. Tutaj zastosujemy „for Loop od 0 do wartości zmiennej„ A ”. Ponadto wydrukujemy instrukcję „liczbę wątków” za pomocą instrukcji „Cout”. Wzywamy funkcję main (). W tym wątku posiadająca wartość 6 zostanie zadeklarowana. Gdy wątek otrzyma połączenie, wykonuje kod i wyświetla wiadomość na ekranie.

Wniosek

W tym przewodniku rozmawialiśmy o wątku w funkcjach C ++. Następnie obserwujemy różne funkcje wątku w C++. Zdefiniowaliśmy wątek, a także jego typy. Wspominaliśmy również różne parametry wątku. Wykonaliśmy wiele rodzajów kodów. W pierwszym kodzie użyliśmy wątku z wskaźnikiem, jest to niestatyczna funkcja członka. Po drugie, w kodzie używamy wątku bez wskaźnika, jest to statyczna funkcja członka. Trzeci i ostatni kod, użyliśmy operatora void, a kiedy wątek otrzymał wartość, wyświetlała wiadomość na ekranie.