Jak uzyskać identyfikator wątku w c++?

Jak uzyskać identyfikator wątku w c++?
Zanim dowiedzieć się, jak uzyskać identyfikator wątku wątku, musisz najpierw poznać dwie formy identyfikatora wątku w C++. Odpowiada to wiedzy, jaki identyfikator jest uzyskiwany, gdy wątek nie działa i jaki identyfikator jest uzyskiwany, gdy wątek działa. Bieganie oznacza wykonywanie. Identyfikator (dla identyfikatora) jest tym, co coś identyfikuje. W C ++ nazwa identyfikatora wątku jest identyfikatorem, małymi literami.

W przypadku wątku w C ++ identyfikator jest obiektem z funkcjami danych i funkcjami członkowskimi. Ten obiekt ID ma kod tekstowy, co ludzie zwykle uważają za identyfikator. Obiekt ID używa << operator to send the text code to the cout object (terminal). The id object and its text code are different from when the thread is not running to when it is running.

Wątek jest klasą, w której obiekt ID jest członkiem danych. Obiekt ID można uzyskać za pomocą następującej składni:

Wątek :: get_id ()

Składnia „Wątek :: get_id ()” można użyć, gdy wątek nie działa, a także gdy wątek się uruchomi, i da różne obiekty i odpowiednie kody tekstowe dla dwóch różnych sytuacji.

Sposobem na uzyskanie identyfikatora wątku w ciele wątku, jest użycie składni:

this_thread :: get_id ()

Wszystkie uruchomione wątki mają różne obiekty ID i odpowiednie kody tekstowe. Wszystkie wątki, które nie działają, mają ten sam odpowiedni kod tekstowy dla tego samego programu. Chociaż mają ten sam kod tekstowy, wszystkie wątki, które nie uruchomiły się, mają różne obiekty identyfikatorów, ponieważ obiekty są referencjami, a nie wskaźnikami.

Wątek, który działa, jest określany jako wątek wydłużenia.

Aby skompilować program wątków, z kompilatorem G ++, użyj polecenia podobnego do:

G ++ -Std = C ++ 2a Temp.cpp -lpthread -o temp

W tym artykule wyjaśniono różne sposoby uzyskania identyfikatorów różnych wątków w C ++, zaczynając od podsumowania tego, czym jest wątek.

Treść artykułu

  • Podsumowanie wątku
  • Uzyskanie identyfikatora wątku
  • Użycie tego_thread :: get_id ()
  • Wniosek

Podsumowanie wątku

Wątek jest obudową funkcji najwyższego poziomu. Wątek jest utworzony z klasy wątku. Nazwa funkcji najwyższego poziomu jest argumentem funkcji konstruktora obiektu wątku. Funkcja main () w C ++ jest również funkcją najwyższego poziomu. Tak więc funkcja main () zachowuje się jak główny wątek. Poniższy program pokazuje dwa wątki, z których funkcja main () jest jednym:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
wątek th;
void fun ()
Cout <<"This is line A." <Cout <<"This is line B." <
int main ()

thr = wątek (zabawa);
thr.dołączyć();
/* sprawozdania */
powrót 0;

Wyjście to:

To jest linia a.
To jest linia B.

Funkcje najwyższego poziomu są zabawne () i main (). Main () jest jak główny wątek. Nazwa funkcji najwyższego poziomu, FUN () jest argumentem dla konstruktora wątku, Thr, w funkcji głównej.

Program zaczyna się od włączenia biblioteki iostream. Następnie następuje włączenie biblioteki wątków. Późniejsze stwierdzenie zapewnia, że ​​każda nazwa użyta w programie jest standardowej przestrzeni nazwy, chyba że wskazano inaczej.

Następnie wątek thr jest zadeklarowany bez wywołania funkcji. Funkcja najwyższego poziomu, FUN () jest następnie zdefiniowana. Następnie jest definicją funkcji Main (). Pierwsza instrukcja w Main () przypisuje funkcję, zabawę () do wątku, Thr, a także wywołuje funkcję.

Drugie stwierdzenie w Main () jest oświadczeniem dołączania. Jeśli to stwierdzenie jest nieobecne, główny wątek może działać do zakończenia bez wątku, Thr thring do własnego ukończenia. Z tym stwierdzeniem, w punkcie, w którym instrukcja jest wpisana, główny wątek (funkcja) zatrzymuje (bloki) i umożliwia wykonanie połączonego wątku (Thr) do jego zakończenia; Zanim główny wątek będzie kontynuował własne ukończenie. Próba skompilowania programu bez instrukcji połączenia powinna zakończyć się komunikatem o błędzie i bez kompilacji.

Gdy wątek jest zadeklarowany z oświadczeniem,

wątek th;

To nie jest działający wątek; Żadna funkcja nie działa. Jednak gdy wątek, THR otrzymuje nazwę funkcji jako argument, jak w,

thr = wątek (zabawa);

staje się bieżącym wątkiem. To stwierdzenie jest również wywołaniem funkcji dla funkcji, zabaw ().

Po instrukcji łączenia w głównej funkcji wątek, Thr zakończył wykonanie i nie jest już działającym wątkiem. W tym stanie jego identyfikator różni się od tego.

Uzyskanie identyfikatora wątku

Poniższy program pokazuje podstawowy sposób uzyskania identyfikatora wątku, gdy wątek nie jest wykonywany, a także po wykonywaniu:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
wątek th;
void fun ()
Cout <<"This is line A." <Wątek :: iddr = thr.get_id ();
Cout <Cout <<"This is line B." <
int main ()

wątek :: id idd = thr.get_id ();
Cout <thr = wątek (zabawa);
thr.dołączyć();
// cout </* sprawozdania */
powrót 0;

Wyjście komputera autora to:

Wątek :: ID z wątroby nieekonkującego
To jest linia a.
140362842543872
To jest linia B.

THR jest zmienną globalną. Jest używany w ramach funkcji wątku Thr, w instrukcji:

Wątek :: iddr = thr.get_id ();

Zmienna przytrzymująca uzyskany obiekt wątku to IDR. Chociaż ID jest instancjalnym obiektem, jest także członkiem klasy wątków. Zatem deklaracja IDR musi być:

Wątek :: id IDR

z półkolisem. Następnym stwierdzeniem po tym jest:

Cout <

Operator, <

wątek :: id idd = thr.get_id ();

W funkcji Main (). Jest taki sam jak w funkcji wykonywania wątku, z wyjątkiem zmiennej odbierającej, idd. Ta instrukcja jest wykonywana przed wątkiem, THR przypisuje się funkcję. Identyfikator tekstu (kod) dla tego wątku, który nie jest wykonywany, to:

Wątek :: ID z wątroby nieekonkującego

Podczas wykonywania funkcji main (. I tak „thr.get_id () ”powinien być w stanie zwrócić identyfikator wątku, gdy nie jest wykonywany. Na razie program C ++ opracowany z G ++ ma trudności z uzyskaniem identyfikatora wątku, który został ukończony. Dlatego instrukcja identyfikatora po zestawieniu dołączania w powyższym kodzie jest skomentowana.

Użycie tego_thread :: get_id ()

„This_thread ::” jest kodowane w wątku wykonania (funkcja). Reprezentuje aktualnie działający wątek. Po nim może być funkcja wątku, taka jak get_id ()

this_thread :: get_id ()

Aby uzyskać identyfikator wątku działającego wątku, który różni się od identyfikatora, gdy wątek nie działa.

„This_thread ::” jest używany w ciele funkcji wątku. Poniższy program ilustruje to dla wątku, thr:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
wątek th;
void fun ()
Cout <<"This is line A." <wątek :: iddr = this_thread :: get_id ();
Cout <Cout <<"This is line B." <
int main ()

wątek :: id idd = thr.get_id ();
Cout <thr = wątek (zabawa);
thr.dołączyć();
powrót 0;

Wyjście komputera autora to:

Wątek :: ID z wątroby nieekonkującego
To jest linia a.
140199206078208
To jest linia B.

Zauważ, że nazwa wątku, Thr, nie była używana w ciele funkcji wątku, w tym przypadku.

Wniosek

Istnieją dwie formy identyfikatora wątku w C++. Identyfikator, gdy wątek jest wykonywany, różni się od identyfikatora, gdy wątek nie jest wykonywany. Identyfikator (dla identyfikatora) jest tym, co coś identyfikuje. W C ++ nazwa identyfikatora wątku jest identyfikatorem, małymi literami. To jest element danych w klasie wątków. To nie jest fundamentalny obiekt. Jest utworzony z własnej klasy, przestrzeni nazw, wątek :: identyfikator. Chociaż identyfikator jest obiektem, ma odpowiedni formularz tekstowy. Formularz tekstowy można wstawić do obiektu Cout (terminal) z operatorem insercji C ++, <<.

Każdy wątek ma dwa różne identyfikatory: jeden, gdy wątek działa; a drugi, gdy wątek nie działa. Gdy wątek nie działa, formularz tekstu dla identyfikatora jest inny niż formularz tekstowy, gdy wątek uruchomi się dla tego samego wątku.

Specyfikacja C ++ ma różne sposoby uzyskania identyfikatora wątku. Jednak na razie, wraz z kompilatorem G ++, jedyne sposoby uzyskania identyfikatora są wyrażenia: „ThreadObject.get_id () ”i„ this_thread :: get_id () ”. „This_thread :: get_id ()” jest używany w ramach funkcji wykonującego wątku, gdzie „this_thread ::” odnosi się do aktualnego wątku. Działający wątek jest określany jako wątek wykonania.