Teiesugused lugejad aitavad MUO-d toetada. Kui teete ostu meie saidil olevate linkide abil, võime teenida sidusettevõtte komisjonitasu. Loe rohkem.

Linuxis saate lõime luua ja hallata C/C++-s, kasutades POSIX-i lõime (pthread) teeki. Erinevalt teistest operatsioonisüsteemidest on Linuxis lõime ja protsessi vahel vähe erinevusi. Seetõttu viitab Linux sageli oma lõimedele kui kergetele protsessidele.

Pthread teeki kasutades saate lõime luua, oodata nende lõppemist ja need selgesõnaliselt lõpetada.

Lõime kasutamise ajalugu Linuxis

Enne Linuxi versiooni 2.6 oli peamiseks lõimeks LinuxThreads. Sellel rakendusel olid jõudluse ja sünkroonimistoimingute osas märkimisväärsed piirangud. Käitatavate lõimede maksimaalse arvu piirang piiras nende arvu 1000-ni.

2003. aastal õnnestus IBMi ja RedHati arendajate juhitud meeskonnal see luua Native POSIX lõimeteek (NPTL) projekt saadaval. Seda tutvustati esmakordselt RedHat Enterprise'i versioonis 3, et lahendada Linuxi Java virtuaalmasina jõudlusprobleemid. Tänapäeval sisaldab GNU C teek mõlema keermestusmehhanismi rakendusi.

instagram viewer

Kumbki neist ei ole roheliste lõimede rakendamine, mida virtuaalmasin hallaks ja töötaks puhtalt kasutajarežiimis. Kui kasutate pthread teeki, loob kernel lõime iga kord, kui programm käivitub.

Lõimepõhise teabe leiate allolevatest failidest mis tahes töötava protsessi kohta /proc//task. See on alloleva protsessiteabe standardne asukoht procfs Linuxi standard. Ühe lõimega rakenduste puhul näib, et selle kataloogi all on PID-ga sama väärtusega tegumikirje.

Lõimede tööloogika

Lõimed on nagu praegu operatsioonisüsteemis töötavad protsessid. Ühe protsessoriga süsteemides (nt mikrokontrollerites) simuleerib operatsioonisüsteemi tuum lõime. See võimaldab viilutamise kaudu tehinguid üheaegselt käivitada.

Ühetuumaline operatsioonisüsteem saab korraga käitada ainult ühte protsessi. Siiski sisse mitmetuumalised või mitme protsessoriga süsteemid, võivad need protsessid käia samaaegselt.

Lõime loomine C-s

Võite kasutada pthread_create funktsioon uue lõime loomiseks. The pthread.h päisefail sisaldab selle allkirja määratlust koos muude lõimega seotud funktsioonidega. Lõimed kasutavad sama aadressiruumi ja failideskriptoreid nagu põhiprogramm.

Pthread teek sisaldab ka vajalikku tuge sünkroonimistoiminguteks vajalike mutexi ja tingimuslike operatsioonide jaoks.

Kui kasutate pthread teegi funktsioone, peate tagama, et kompilaator lingiks p lõim teeki oma käivitatavasse faili. Vajadusel saate anda kompilaatorile korralduse linkida teeki kasutades -l valik:

gcc -o test test_lõim.c -lpthread

Funktsioonil pthread_create on järgmine signatuur:

intpthread_create(pthread_t *niit, konstpthread_attr_t *attr, tühine **(*start_rutiin)(tühine *), tühine *arg)

See tagastab 0, kui protseduur on edukas. Probleemi korral tagastab see nullist erineva veakoodi. Ülaltoodud funktsiooni allkirjas:

  • The niit parameeter on tüüpi pthread_t. Loodud lõimele on selle viitega alati juurdepääs.
  • The attr parameeter võimaldab määrata kohandatud käitumist. Saate kasutada rida lõimepõhiseid funktsioone, mis algavad tähega pthread_attr_ selle väärtuse seadistamiseks. Võimalikud kohandused on ajastamispoliitika, virna suurus ja eraldamise poliitika.
  • start_rutiin määrab funktsiooni, mida lõim käivitab.
  • arg esindab üldist andmestruktuuri, mille lõime edastab funktsioonile.

Siin on rakenduse näide:

#sisaldama
#sisaldama
#sisaldama
#sisaldama

tühine *tööline(tühine *andmed)
{
char *nimi = (char*)andmed;

jaoks (int i = 0; ma < 120; i++)
{
magama (50000);
printf("Tere lõime nimest = %s\n", nimi);
}

printf("Lõim %s valmis!\n", nimi);
tagasiNULL;
}

intpeamine(tühine)
{
pthread_t th1, th2;
pthread_create(&th1, NULL, töötaja, "X");
pthread_create(&th2, NULL, töötaja, "Y");
magama (5);
printf("Põhiprogrammist väljumine\n");
tagasi0;
}

Keerme tüübid

Kui niit naaseb peamine () funktsioon rakenduses, lõpevad kõik lõimed ja süsteem vabastab kõik programmi kasutatud ressursid. Samamoodi, kui lahkute mis tahes lõimest käsuga nagu an exit (), lõpetab teie programm kõik lõimed.

Koos pthread_join funktsiooni, võite selle asemel oodata lõime lõpetamist. Seda funktsiooni kasutav lõim blokeerub, kuni oodatud lõim lõpeb. Ressursid, mida nad süsteemist kasutavad, ei tagastata isegi sellistel juhtudel, nagu näiteks ühendatavate lõimede lõpetamine, protsessori poolt planeerimata või isegi liitumise ebaõnnestumine. ptread_join.

Mõnikord on olukordi, kus pthread_join-ga liitumisel pole mõtet; kui näiteks lõime lõppu on võimatu ennustada. Sel juhul saate tagada, et süsteem tagastab lõime naasmise kohas kõik ressursid automaatselt.

Selle saavutamiseks peaksite alustama vastavaid lõime tähega ERALDI olek. Lõime alustades ERALDA olekut saab määrata lõime atribuudi väärtuste või nupuga pthread_detach funktsioon:

intpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
intpthread_detach(pthread_t niit);

Siin on näide pthread_join() kasutamisest. Asendage esimese programmi põhifunktsioon järgmisega:

intpeamine(tühine)
{
pthread_t th1, th2;
pthread_create(&th1, NULL, töötaja, "X");
pthread_create(&th2, NULL, töötaja, "Y");
magama (5);
printf("peaprogrammist väljumine\n");
pthread_join (th1, NULL);
pthread_join (th2, NULL);
tagasi0;
}

Programmi kompileerimisel ja käivitamisel on teie väljund järgmine:

Tere, lõimest Y
Tere teemast X
Tere, lõimest Y
...
Tere, lõimest Y
põhiprogrammist väljumine
Tere teemast X
...
Tere teemast X
Lõim X tehtud!
Tere, lõimest Y
Lõim Y tehtud!

Teema lõpetamine

Lõime saab tühistada, kutsudes pthread_cancel, edastades vastava pthread_t id:

intpthread_cancel(pthread_t niit);

Seda näete järgmises koodis. Jällegi ainult peamine funktsioon on erinev:

intpeamine(tühine)
{
pthread_t th1, th2;
pthread_create(&th1, NULL, töötaja, "X");
pthread_create(&th2, NULL, töötaja, "Y");
magama (1);
printf("> Lõime Y tühistamine!!\n");
pthread_cancel (th2);
magama (100000);
printf("> Lõime X tühistamine!\n");
pthread_cancel (th1);
printf("peaprogrammist väljumine\n");
tagasi0;
}

Miks lõime luuakse?

Operatsioonisüsteemid püüavad alati käivitada lõime ühes või mitmes CPU-s, kas enda loodud loendist või kasutaja loodud lõimede loendist. Mõned lõimed ei saa käivitada, kuna nad ootavad riistvara sisend-/väljundsignaali. Nad võivad oodata ka vabatahtlikult, oodata vastust teiselt lõimelt või mõni teine ​​lõim neid blokeerida.

Saate kohandada pthreadi abil loodud lõimedele eraldatavaid ressursse. See võib olla kohandatud ajastamispoliitika või soovi korral saate valida ajastamisalgoritmid, nagu FIFO või Round-robin.