Lag et trådbasseng i C ++

Lag et trådbasseng i C ++
Et trådbasseng er et sett med tråder der hver tråd har en slags oppgave å utføre. Så forskjellige tråder utfører forskjellige typer oppgaver. Så hver tråd har sin spesialisering av oppgaver. En oppgave er i utgangspunktet en funksjon. Lignende funksjoner gjøres av en bestemt tråd; Et annet lignende sett med funksjoner gjøres av en annen tråd, og så videre. Selv om en utførende tråd utfører en funksjon på toppnivå, er en tråd per definisjon oppstart av et objekt fra trådklassen. Ulike tråder har forskjellige argumenter, så en bestemt tråd bør ivareta et lignende sett med funksjoner.

I C ++ må dette trådbassenget styres. C ++ har ikke et bibliotek for å lage et trådbasseng og er ledelse. Dette er sannsynligvis fordi det er forskjellige måter å lage et trådbasseng. Så en C ++ -programmer må lage et trådbasseng basert på behovene.

Hva er en tråd? En tråd er et objekt instantiert fra trådklassen. Ved normal oppstart er det første argumentet til trådkonstruktøren navnet på en toppnivåfunksjon. Resten av argumentene til trådkonstruktøren er argumenter for funksjonen. Når tråden er instantiert, begynner funksjonen å utføre. C ++ Main () -funksjonen er en funksjon på toppnivå. Andre funksjoner i det globale omfanget er funksjoner på toppnivå. Det hender at hovedfunksjonen () er en tråd som ikke trenger formell erklæring som andre tråder gjør. Tenk på følgende program:

#inkludere
#inkludere
ved hjelp av navneområdet STD;
void func ()
cout << "code for first output" << endl;
cout << "code for second output" << endl;

int main ()

Tråd Thr (func);
thr.bli med();
/ * Andre uttalelser */
retur 0;

Utgangen er:

Kode for første utgang
Kode for andre utgang

Legg merke til inkludering av trådbiblioteket som har trådklassen. func () er en funksjon på toppnivå. Den første uttalelsen i Main () -funksjonen bruker den i oppstart av tråden, THR. Neste uttalelse i Main (), er en Join -uttalelse. Den blir med tråden THR til kroppen til hovedtråden (), på den posisjonen den er kodet. Hvis denne uttalelsen er fraværende, kan hovedfunksjonen utføres til fullføring uten at trådfunksjonen er fullført. Det betyr problemer.

En kommando som ligner på følgende, bør brukes til å kjøre et C ++ 20 -programprogram, for G ++ -kompilatoren:

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

Denne artikkelen forklarer en måte å lage og administrere et trådbasseng i C++.

Artikkelinnhold

  • Trådbassengeksempelskrav
  • Globale variabler
  • Master trådfunksjonen
  • hovedfunksjon
  • Konklusjon

Trådbassengeksempelskrav

Kravene til dette illustrerende trådbassenget er enkle: det er tre tråder og en mestertråd. Trådene er underordnet mestertråden. Hver underordnede tråd fungerer med en kø datastruktur. Så det er tre køer: qu1, qu2 og qu3. Købiblioteket, så vel som trådbiblioteket, må inkluderes i programmet.

Hver kø kan ha mer enn en funksjonsanrop, men av samme toppnivåfunksjon. Det vil si at hvert element i en kø er for en funksjonsanrop for en bestemt funksjon på toppnivå. Så det er tre forskjellige funksjoner på toppnivå: en funksjon på toppnivå per tråd. Funksjonsnavnene er FN1, FN2 og FN3.

Funksjonen krever hver kø bare skiller seg ut i sine argumenter. For enkelhet og for dette programeksemplet vil ikke funksjonsanropene ikke ha noe argument. Faktisk vil verdien av hver kø i dette eksemplet være det samme heltallet: 1 som verdien for alle Qu1 -elementene; 2 som verdien for alle Qu2 -elementene; og 3 som verdien for alle Qu3 -elementene.

En kø er en første_in-first_out-struktur. Så den første samtalen (nummer) som kommer inn i køen er den første som forlater. Når en samtale (nummer) forlater, blir den tilsvarende funksjonen og tråden utført.

Hovedfunksjonen () er ansvarlig for å mate hver av de tre køene, med anrop for passende funksjoner, derav passende tråder.

Hovedtråden er ansvarlig for å sjekke om det er en samtale i noen kø, og hvis det er en samtale, kaller den riktig funksjon gjennom tråden. I dette programeksemplet, når ingen kø har noen tråd, slutter programmet.

Toppnivåfunksjonene er enkle, for dette pedagogiske eksemplet er de:

void fn1 ()
cout << "fn1" << endl;

void fn2 ()
cout << "fn2" << endl;

void fn3 ()
cout << "fn3" << endl;

De tilsvarende trådene vil være Thr1, Thr2 og Thr3. Mestertråden har sin egen masterfunksjon. Her har hver funksjon bare en uttalelse. Utgangen til funksjonen FN1 () er “FN1”. Utgangen til funksjonen FN2 () er “FN2”. Utgangen til funksjonen FN3 () er “FN3”.

På slutten av denne artikkelen kan leseren sette sammen alle kodesegmentene i denne artikkelen for å danne et trådbassengprogram.

Globale variabler

Toppen av programmet med de globale variablene, er:

#inkludere
#inkludere
#inkludere
ved hjelp av navneområdet STD;
qu1;
qu2;
qu3;
tråd Thr1;
tråd Thr2;
tråd Thr3;

Kø- og trådvariablene er globale variabler. De er blitt erklært uten initialisering eller erklæring. Etter dette, i programmet, bør være de tre underordnede funksjonene på toppnivå, som vist ovenfor.

Iostream -biblioteket er inkludert for Cout -objektet. Trådbiblioteket er inkludert for trådene. Navnene på trådene er Thr1, Thr2 og Thr3. Købiblioteket er inkludert for køene. Navnene på køene er qu1, qu2 og qu3. Qu1 tilsvarer Thr1; Qu2 tilsvarer Thr2, og Qu3 tilsvarer Thr3. En kø er som en vektor, men den er for FIFO (FIRST_IN-FIRST_OUT).

Master trådfunksjonen

Etter de tre underordnede funksjonene på toppnivå er hovedfunksjonen i programmet. Det er:

void masterfn ()
arbeid:
if (qu1.størrelse ()> 0) Thr1 = tråd (FN1);
if (qu2.størrelse ()> 0) Thr2 = tråd (fn2);
if (qu3.størrelse ()> 0) Thr3 = tråd (FN3);
if (qu1.størrelse ()> 0)
Qu1.pop ();
Thr1.bli med();

if (qu2.størrelse ()> 0)
qu2.pop ();
Thr2.bli med();

if (qu3.størrelse ()> 0)
qu3.pop ();
Thr3.bli med();

if (qu1.størrelse () == 0 && qu1.størrelse () == 0 && qu1.størrelse () == 0)
komme tilbake;
Gå på jobb;

Goto-loop legemliggjør all funksjonskoden. Når alle køene er tomme, returnerer funksjonen ugyldig, med uttalelsen, "return;".

Det første kodesegmentet i goto-loop har tre utsagn: en for hver kø og den tilsvarende tråden. Her, hvis en kø ikke er tom, blir tråden (og tilsvarende underordnet funksjon på toppnivå) utført.

Neste kodesegment består av tre IF-konstruksjoner, som hver tilsvarer en underordnet tråd. Hver IF-konstruksjon har to uttalelser. Den første uttalelsen fjerner nummeret (for samtalen), som kan ha funnet sted i det første kodesegmentet. Den neste er en Join -uttalelse, som sørger for at den tilsvarende tråden fungerer for fullføring.

Den siste uttalelsen i goto-loopen avslutter funksjonen, og går ut av løkken hvis alle køene er tomme.

Hovedfunksjon

Etter mastertrådfunksjonen i programmet, skal være hovedfunksjonen (), hvis innhold er:

Qu1.Push (1);
Qu1.Push (1);
Qu1.Push (1);
qu2.Push (2);
qu2.Push (2);
qu3.Push (3);
tråd masterthr (masterfn);
cout << "Program has started:" << endl;
masterth.bli med();
cout << "Program has ended." << endl;

Hovedfunksjonen () er ansvarlig for å sette tall som representerer samtaler i køene. Qu1 har tre verdier på 1; qu2 har to verdier på 2, og qu3 har en verdi på 3. Hoved () -funksjonen starter mastertråden og blir med den til kroppen. En utgang fra forfatterens datamaskin er:

Programmet har startet:
fn2
FN3
fn1
fn1
fn2
fn1
Programmet er avsluttet.

Utgangen viser den uregelmessige samtidige driften av tråder. Før hovedfunksjonen () blir med i sin mastertråd, viser den "programmet har startet:". Mastertråden ringer Thr1 for Fn1 (), Thr2 for Fn2 () og Thr3 for Fn3 (), i den rekkefølgen. Imidlertid begynner den tilsvarende utgangen med "FN2", deretter "FN3", og deretter "FN1". Det er ingenting galt med denne første ordren. Det er slik samtidighet fungerer, uregelmessig. Resten av utgangsstrengene vises som funksjonene deres ble kalt.

Etter at hovedfunksjonsorganet ble med i mestertråden, ventet den på at mestertråden skulle fullføre. For at mestertråden skal fullføres, må alle køene være tomme. Hver køverdi tilsvarer utførelsen av den tilsvarende tråden. Så for hver kø for å bli tom, må tråden utføres i det antall ganger; Det er elementer i køen.

Når mastertråden og dens tråder er utført og avsluttet, fortsetter hovedfunksjonen å utføre. Og det viser, “Programmet er avsluttet.”.

Konklusjon

Et trådbasseng er et sett med tråder. Hver tråd er ansvarlig for å utføre sine egne oppgaver. Oppgaver er funksjoner. I teorien kommer oppgavene alltid. De slutter egentlig ikke, som illustrert i eksemplet ovenfor. I noen praktiske eksempler deles data mellom trådene. For å dele data trenger programmereren kunnskap om betinget_variabel, asynkron funksjon, løfte og fremtid. Det er en diskusjon for en annen gang.