C++ Mutex zaključavanje

C Mutex Zakljucavanje



Poznato je da je C++ jedan od najbržih programskih jezika s dobrim performansama, visokom preciznošću i odgovarajućim sustavom upravljanja memorijom. Ovaj programski jezik također podržava istovremeno izvođenje više niti s dijeljenjem više resursa između njih. U multithreadingu, nit samo izvodi operaciju čitanja koja ne stvara probleme budući da na nit ne utječe ono što druge niti rade u to vrijeme. Ali ako su te niti morale međusobno dijeliti resurse, jedna nit može modificirati podatke u to vrijeme, što čini problem. Kako bismo riješili ovaj problem, imamo C++ “Mutex” koji sprječava pristup više resursa prema našem kodu/objektu pružajući sinkronizaciju koja navodi da se pristup objektu/kodu može omogućiti samo jednoj niti u jednom trenutku, tako da više niti ne bi moglo istovremeno pristupiti tom objektu.

Postupak:

Upoznat ćemo kako možemo zaustaviti pristup višestrukih niti objektu u jednom trenutku koristeći mutex zaključavanje. Razgovarat ćemo o sintaksi zaključavanja mutexa, što je višestruko niti i kako se možemo nositi s problemima uzrokovanim višestrukim nitima pomoću zaključavanja mutexa. Zatim ćemo uzeti primjer više niti i na njih implementirati zaključavanje muteksa.







Sintaksa:

Ako želimo naučiti kako možemo implementirati mutex zaključavanje tako da možemo spriječiti pristup više niti istovremeno našem objektu ili kodu, možemo koristiti sljedeću sintaksu:



$ std :: mutex mut_x

$mut_x. zaključati ( ) ;

Nevažeći naziv_funkcije ( ) {

$ // ovdje bi bio napisan kod koji želimo sakriti od više niti

$mut_x. otključava ( ) ;

}

Sada ćemo koristiti ovu sintaksu na lažnom primjeru iu pseudo kodu (koji ne možemo tek tako pokrenuti u uređivaču koda) da bismo vam rekli kako točno možemo koristiti ovu sintaksu kao što je navedeno u nastavku:



$ std :: mutex mut_x

Prazni blok ( ) {

$mut_x. zaključati ( ) ;

$ std :: cout << 'zdravo' ;

$mut_x. otključava ( ) ;

}

Primjer:

U ovom primjeru, pokušajmo prvo stvoriti operaciju s više niti, a zatim ovu operaciju okružimo zaključavanjem i otključavanjem muteksa kako bismo omogućili sinkronizaciju operacije s kreiranim kodom ili objektom. Mutex se bavi uvjetima utrke, a to su vrijednosti koje su prilično nepredvidive i ovise o prebacivanju niti koje su svjesne vremena. Da bismo implementirali primjer za mutex, prvo moramo uvesti važne i potrebne biblioteke iz repozitorija. Potrebne biblioteke su:





$ # uključi

$ # uključiti

$ # uključi

Biblioteka 'iostream' pruža nam funkciju za prikaz podataka kao Cout, čitanje podataka kao Cin i završetak izjave kao endl. Koristimo biblioteku 'nit' za korištenje programa ili funkcija iz niti. Knjižnica 'mutex' omogućuje nam implementaciju zaključavanja i otključavanja mutexa u kodu. Koristimo '# uključi' jer to dopušta da svi programi povezani s bibliotekom budu uključeni u kod.

Sada, nakon što je prethodni korak obavljen, definiramo mutex klasu ili globalnu varijablu za mutex koristeći std. Zatim stvaramo funkciju za zaključavanje i otključavanje mutexa koju bismo kasnije mogli pozvati u kodu. U ovom primjeru ovu funkciju nazivamo blok. U tijelu blok funkcije prvo pozivamo 'mutex.lock()' i počinjemo pisati logiku koda.



Mutex.lock() uskraćuje pristup drugim nitima da dođu do našeg stvorenog objekta ili koda tako da samo jedna nit može čitati naš objekt u jednom trenutku. U logici pokrećemo for petlju koja radi na indeksu od 0 do 9. Prikazujemo vrijednosti u petlji. Nakon što se ova logika stvori u zaključavanju mutexa nakon što je njegova operacija obavljena ili nakon izlaska iz logike, pozivamo metodu 'mutex.unlock()'. Ovaj poziv metode omogućuje nam da otključamo kreirani objekt iz zaključavanja mutexa budući da je pristup objekta jednoj jedinoj niti omogućen ranije i nakon što operaciju na tom objektu izvrši jedna nit odjednom. Sada želimo da i druge niti pristupe tom objektu ili kodu. U suprotnom, naš se kod kreće u situaciju 'zastoja' što uzrokuje da stvoreni objekt s muteksom zauvijek ostane u zaključanoj situaciji i nijedna druga nit ne bi mogla pristupiti tom objektu. Stoga se nedovršena operacija nastavlja izvršavati. Nakon toga izlazimo iz blok funkcije i prelazimo na glavnu.

U glavnom, jednostavno prikazujemo naš stvoreni mutex stvaranjem tri niti pomoću 'std :: thread thread_name (pozivanje već stvorene blok funkcije ovdje u kojoj smo stvorili mutex)' s nazivima thread1, thread2 i thread3, itd. Na ovaj način se stvaraju tri niti. Zatim pridružujemo ove tri niti koje će se izvoditi istovremeno pozivanjem “thread_name. spoji ()” metoda. I onda vraćamo vrijednost jednaku nuli. Prethodno navedeno objašnjenje primjera implementirano je u obliku koda koji se može prikazati na sljedećoj slici:

U izlazu koda možemo vidjeti izvođenje i prikaz sve tri niti jednu po jednu. Možemo vidjeti čak i ako naša aplikacija spada u kategoriju višenitnosti. Ipak, nijedna od niti nije prebrisala ili modificirala podatke i podijelila modificirani resurs zbog implementacije mutexa 'funkcijskog bloka'.

Zaključak

Ovaj vodič daje detaljno objašnjenje koncepta mutex funkcije koja se koristi u C++. Raspravljali smo o tome što su višenitne aplikacije, s kojim se problemima moramo susresti u višenitnim aplikacijama i zašto trebamo implementirati mutex za višenitne aplikacije. Zatim smo razgovarali o sintaksi za mutex s lažnim primjerom koristeći pseudokod. Zatim smo implementirali potpuni primjer na multithreading aplikacijama s mutexom na C++ Visual Studio.