Hvordan dreper du en tråd i C++?

Hvordan dreper du en tråd i C++?
Du bør ikke drepe en tråd i utførelsen av følgende grunner:
  • En tråd kan ha åpnet en fil for skriving, og hvis den drepes, ville ikke filen være lukket. Det er trøbbel.
  • En tråd kan ha skaffet seg en lås på datamaskinressurser for sin eneste bruk. Hvis tråden blir drept, vil ressursene forbli låst, og andre tråder og prosesser vil ikke kunne bruke ressursene.
  • Minnet som er tildelt må frigjøres. Tråden kan ha tildelt noe minne til et eller annet formål. Hvis tråden blir drept, vil minnet forbli falskt tildelt og utilgjengelig for andre tråder og prosesser. Det er en minnelekkasje.

Disse grunnene og andre måter at hvis en tråd blir drept, ville ressurser som den kan ha skaffet seg ikke bli utgitt for bruk av andre tråder og prosesser. Når en tråd fullføres naturlig, slippes enhver ressurs som er anskaffet.

Det typiske motivet for å drepe en tråd er at brukeren ikke lenger trenger resultatet av tråden.

Det er noen gode nyheter: C ++ 20 er den siste versjonen av C ++ i dag. Trådklassen til C ++ 20 har komponenter for å frigjøre ressursene, av en tråd, før dens naturlige ende og stoppe den før dens naturlige slutt. På denne måten stopper C ++ tråden og dreper ikke tråden. Sagt på en annen måte, C ++ 20 dreper tråden ansvarlig. Å frigjøre ressurser og stopping av tråden er automatisk. Merk: Ikke alle tråder kan stoppes på denne måten. Slike tråder ville fullføre naturlig, selv om det blir gjort et forsøk på å stoppe dem.

Trådbiblioteket har følgende klasser for å stoppe med utgivelsen av ressurser: stop_token, stop_source og stop_callback. Hver av disse klassene kan ha gjenstander som er instantiert fra. Imidlertid er det bare stop_token og stop_source som er vurdert i denne opplæringen.

Kommandoen for å kjøre et program med tråder, med G ++ -kompilatoren, for C+20, skal være lik:

G ++ -STD = C ++ 2A Temp.CPP -LPTHREAD -O TEMP

Denne opplæringen forklarer hvordan du kan stoppe en tråd med ressurser som frigjøres. Å stoppe en tråd med ressurser som frigjøres er en ansvarlig måte å drepe en tråd. Denne opplæringen begynner med et sammendrag av koding av en tråd.

Artikkelinnhold

  • Trådkodingsoppsummering
  • Jthread -klassen
  • Be om å stoppe en tråd
  • Er stopp mulig?
  • Er stoppforespørsel blitt fremsatt?
  • Konklusjon

Trådkodingsoppsummering

Et løpsprogram i C ++ er en prosess. En tråd er en underprosess av en prosess. Et enkelt C ++ -program har bare en tråd, som er hovedfunksjonen (). Hovedfunksjonen () er ikke en formelt erklært tråd. Enhver annen tråd for det samme programmet må formelt erklæres. Det kan være mer enn en tråd i et program.

En tråd blir instantiert fra en trådklasse på trådbiblioteket. Det første argumentet i erklæringen om et trådobjekt er navnet på en toppnivåfunksjon. Toppnivåfunksjonen er den effektive tråden. Når objektet blir instantiert, begynner toppnivåfunksjonen å utføre (kjører).

Det er en ringetråd og en kalt tråd. Dessverre, hvis den kalt tråden ikke er sammenføyd fra funksjonen til den kalte tråden, kan den anropende tråden fullføre utførelsen uten at den kalte tråden har fullført sin egen utførelse. Dette betyr problemer. Så funksjonen til den samtaletråden skal alltid slå sammen den kalte tråden etter oppstart av den kalt tråden.

I det følgende programmet blir et trådobjekt instantiert ved å bruke toppnivåfunksjonen, FN ():

#inkludere
#inkludere
ved hjelp av navneområdet STD;
void fn ()
cout <<"first code segment of thread" <cout <<"second code segment of thread" <
int main ()

tråd Thr (FN);
thr.bli med();
retur 0;

Utgangen er:

Første kodesegment av tråden
Andre kodesegment av tråden

Legg merke til inkludering av trådbiblioteket. Legg merke til hvordan de første og andre uttalelsene fra hovedfunksjonen er kodet. Hovedfunksjonen () er hovedtråden. fn () er en funksjon på toppnivå.

Jthread -klassen

Jthread er en klasse definert i trådbiblioteket. Det er som trådklassen, men har fordelen at den kan brukes til å stoppe en tråd ved å slippe ressurser. Den har medlemsfunksjoner for å returnere et stop_token -objekt og et stop_source -objekt. Medlemsfunksjonene er:

stop_source get_stop_source ()
stop_token get_stop_token ()

Den har også medlemsfunksjonen for å komme med en stoppforespørsel, som er:

bool request_stop ()

Per nå, i oktober 2021, implementerer mange C ++ kompilatorer fortsatt JThread -klassen. Kodeprøvene gitt nedenfor skal imidlertid fungere når kompilatoren din har implementert JThread -klassen.

Be om å stoppe en tråd

Å stoppe tråden betyr å stoppe toppnivåfunksjonen fra å løpe. En forespørsel om å stoppe betyr at tråden skal stoppe så snart som mulig. Hvis forespørselen ikke er gitt, vil tråden kjøres til fullføring og ikke stoppe før slutten.

Som indikert ovenfor, har en tråd som er instantiert fra jthread funksjonene til å drepe en tråd ansvarlig (stopp en tråd fra å slippe ressursene). Medlemsfunksjonen for å be om dette stoppet er:

bool request_stop ()

Returverdien er sann hvis forespørselen ble akseptert og falsk ellers. Å akseptere forespørselen garanterer ikke at tråden stopper så snart som mulig. Det er kanskje ikke mulig å implementere forespørselen, og tråden vil ikke stoppe før dens naturlige slutt. Det vil si at det å returnere sant ikke betyr at stopping er mulig. Følgende program illustrerer bruken av denne medlemsfunksjonen til JThread -objektet:

#inkludere
#inkludere
ved hjelp av navneområdet STD;
void fn ()
cout <<"first code segment of thread" <cout <<"second code segment of thread" <
int main ()

jthread thr (fn);
thr.forespørsel_stop ();
thr.bli med();
retur 0;

Dette programmet ligner på det ovennevnte, men for to punkter:

  • Tråden, THR er instantiert fra JThread -klassen.
  • Uttalelsen (forespørselen) for å stoppe tråden så snart som mulig er plassert før uttalelsen om Join (). I dette tilfellet er den anropende tråden å stoppe den kalte tråden fra å fortsette å utføre.

Er stopp mulig?

I noen situasjoner er det ikke mulig å stoppe en tråd. Programmereren kan imidlertid ikke vite om en tråd kan stoppes eller ikke. I dette tilfellet må programmereren spørre. Stop_source har medlemsfunksjonen,

bool stop_possible () const

Hvis returverdien er sann, er det mulig å stoppe tråden før den naturlige ende. Hvis returverdien er falsk, er det umulig å stoppe tråden før den naturlige ende. jthread har en metode som kan returnere stop_source -objektet.

Så det kan være bedre å spørre om en tråd kan stoppes før du stopper tråden. Følgende program illustrerer dette:

#inkludere
#inkludere
ved hjelp av navneområdet STD;
void fn ()
cout <<"first code segment of thread" <cout <<"second code segment of thread" <
int main ()

jthread thr (fn);
stop_source ss = thr.get_stop_source ();
hvis (ss.stop_possible ())
thr.forespørsel_stop ();
ellers
cout <<"Thread could be stopped!" <thr.bli med();
retur 0;

Stoppkodesegmentet er plassert før Join -uttalelsen.

Er stoppforespørsel blitt fremsatt?

Hvis det er mulig å stoppe en tråd, garanterer det fortsatt ikke at en forespørsel () uttalelse vil lykkes med å stoppe tråden før dens naturlige slutt. Hvis tråden ikke har stoppet før den naturlige enden som håpet på, kan det hende at programmereren vil vite om tråden hadde blitt bedt om å stoppe med Request_Stop () -uttalelsen.

Stop_token -objektet har medlemsfunksjonen,

bool stop_requested ()

Denne funksjonen returnerer sann hvis en stoppforespørsel er gjort og usant ellers. JThread -objektet kan returnere et stop_token -objekt, med medlemsfunksjonen,

stop_token get_stop_token () const

Følgende Main () -funksjonskode illustrerer hvordan du vet om det er utstedt en forespørsel_stopp:

int main ()

jthread thr (fn);
stop_source ss = thr.get_stop_source ();
hvis (ss.stop_possible ())
thr.forespørsel_stop ();
ellers
cout <<"Thread could be stopped!" <stop_token st = thr.get_stop_token ();
if (st.stop_requested ())
cout <<"Still waiting for thrread to stop." <ellers
thr.forespørsel_stop ();
thr.bli med();
retur 0;

All stoppkode er før sammenføyningserklæringen. Ikke forveksle mellom Request_Stop () og stop_requested () funksjoner.

Konklusjon

En tråd kan drepes ansvarlig med C ++ 20 og høyere. Dette betyr å stoppe tråden med ressursene til tråden, frigjort. Trådbiblioteket har stop_token, stop_source, stop_callback og jthread -klasser for å ha drept en tråd ansvarlig. For å bruke stop_token, stop_source og stop_callback instantierte objekter, lag tråden med jthread -klassen. JThread -klassen er i trådbiblioteket, som må inkluderes i C ++ -programmet.

JThread -klassen har medlemsfunksjoner for å returnere stop_token og stop_source -objekter. Selve JThread -klassen har medlemsfunksjonen, Request_Stop (), for å stoppe en tråd. Denne forespørselen vil sannsynligvis bli gitt, men det er ingen garanti for at den vil bli gitt. Hvis forespørselen er gitt, stopper tråden så snart som mulig, uten å nå sin naturlige ende, alt er likt.

Stop_source -objektet kan brukes til å vite om det er mulig å stoppe en tråd. Stop_token -objektet kan brukes til å vite om det er utstedt en forespørsel_stop (). Når en stoppforespørsel er fremsatt, kan den ikke trekkes tilbake (en påfølgende stoppforespørsel har ingen effekt).