C++ Mutex Lock

C Mutex Lock



Znano je, da je C ++ eden najhitrejših programskih jezikov z dobro zmogljivostjo, visoko natančnostjo in ustreznim sistemom za upravljanje pomnilnika. Ta programski jezik podpira tudi hkratno izvajanje več niti z deljenjem več virov med njimi. Pri večnitnosti je nit namenjena samo izvajanju operacije branja, ki ne povzroča težav, saj na nit ne vpliva, kaj počnejo druge niti v tem času. Toda če bi morale te niti deliti vire med seboj, lahko ena nit takrat spremeni podatke, kar povzroči težavo. Za reševanje te težave imamo C++ »Mutex«, ki preprečuje dostop več virov do naše kode/predmeta z zagotavljanjem sinhronizacije, ki navaja, da je dostop do objekta/kode mogoče zagotoviti samo eni niti naenkrat, tako da več niti ne bi moglo dostopati do tega predmeta hkrati.

Postopek:

Spoznali bomo, kako lahko z zaklepanjem mutexa zaustavimo dostop več niti do objekta naenkrat. Govorili bomo o sintaksi zaklepanja mutexa, kaj je večnitnost in kako se lahko spopademo s težavami, ki jih povzroča večnitnost z uporabo zaklepanja mutexa. Nato bomo vzeli primer več niti in na njih implementirali zaklepanje muteksa.







Sintaksa:

Če se želimo naučiti, kako lahko implementiramo zaklepanje muteksa, tako da lahko preprečimo dostop več nitim hkrati do našega predmeta ali kode, lahko uporabimo naslednjo sintakso:



$ std :: mutex mut_x

$mut_x. zaklepanje ( ) ;

Prazno ime_funkcije ( ) {

$ // tukaj bi bila zapisana koda, ki jo želimo skriti pred več nitmi

$mut_x. odklene ( ) ;

}

To sintakso bomo zdaj uporabili na navideznem primeru in v psevdo kodi (ki je ne moremo kar zagnati, kot je v urejevalniku kode), da boste vedeli, kako lahko natančno uporabimo to sintakso, kot je omenjeno v naslednjem:



$ std :: mutex mut_x

Prazen blok ( ) {

$mut_x. zaklepanje ( ) ;

$ std :: cout << 'zdravo' ;

$mut_x. odklene ( ) ;

}

primer:

V tem primeru poskusimo najprej ustvariti večnitno operacijo in nato obkrožimo to operacijo z zaklepanjem in odklepanjem muteksa, da zagotovimo sinhronizacijo operacije z ustvarjeno kodo ali predmetom. Mutex se ukvarja s pogoji tekmovanja, ki so vrednosti, ki so precej nepredvidljive in so odvisne od preklapljanja niti, ki so časovno zavestne. Za implementacijo primera za mutex moramo najprej uvoziti pomembne in zahtevane knjižnice iz repozitorijev. Zahtevane knjižnice so:





$ # vključi

$ # vključi

$ # vključi

Knjižnica »iostream« nam ponuja funkcijo za prikaz podatkov kot Cout, branje podatkov kot Cin in zaključek izjave kot endl. Knjižnico »nit« uporabljamo za uporabo programov ali funkcij iz niti. Knjižnica »mutex« nam omogoča implementacijo zaklepanja in odklepanja mutexa v kodi. Uporabljamo »# include«, ker to dovoljuje, da so vsi programi, povezani s knjižnico, vključeni v kodo.

Zdaj, ko je prejšnji korak opravljen, definiramo razred mutexa ali globalno spremenljivko za mutex z uporabo std. Nato ustvarimo funkcijo za zaklepanje in odklepanje muteksa, ki bi jo lahko pozneje priklicali v kodi. V tem primeru to funkcijo imenujemo blok. V telesu bločne funkcije najprej pokličemo »mutex.lock()« in začnemo pisati logiko kode.



Mutex.lock() zavrne dostop drugih niti do našega ustvarjenega predmeta ali kode, tako da lahko samo ena nit hkrati bere naš predmet. V logiki izvajamo zanko for, ki teče na indeksu od 0 do 9. Vrednosti prikažemo v zanki. Ko je ta logika ustvarjena v ključavnici mutexa po končani operaciji ali po izhodu iz logike, pokličemo metodo »mutex.unlock()«. Ta klic metode nam omogoča, da odklenemo ustvarjeni objekt pred zaklepanjem muteksa, ker je bil dostop objekta do ene same niti zagotovljen prej in ko operacijo na tem objektu izvede ena nit naenkrat. Zdaj želimo, da tudi druge niti dostopajo do tega predmeta ali kode. V nasprotnem primeru se naša koda premakne v 'slepi zastoj', kar povzroči, da ustvarjeni objekt z muteksom za vedno ostane v zaklenjenem položaju in nobena druga nit ne bi mogla dostopati do tega predmeta. Zato se nepopolna operacija še naprej izvaja. Po tem zapustimo funkcijo bloka in se premaknemo na glavno.

V glavnem preprosto prikažemo naš ustvarjeni mutex tako, da ustvarimo tri niti z uporabo »std :: thread thread_name (tukaj kliče že ustvarjeno blokovno funkcijo, v kateri smo ustvarili mutex)« z imeni thread1, thread2 in thread3 itd. Na ta način so ustvarjene tri niti. Nato združimo te tri niti, ki se izvajajo hkrati, tako da pokličemo »thread_name. pridruži ()«. In potem vrnemo vrednost, ki je enaka nič. Prej omenjena razlaga primera je implementirana v obliki kode, ki je prikazana na naslednji sliki:

V izhodu kode lahko vidimo izvajanje in prikaz vseh treh niti eno za drugo. Vidimo lahko tudi, če naša aplikacija spada v kategorijo večnitnosti. Kljub temu nobena od niti ni prepisala ali spremenila podatkov in delila spremenjenega vira zaradi implementacije muteksa 'funkcijskega bloka'.

Zaključek

V tem priročniku je podrobna razlaga koncepta funkcije mutex, ki se uporablja v C++. Razpravljali smo o tem, kaj so večnitne aplikacije, s kakšnimi težavami se srečujemo pri večnitnih aplikacijah in zakaj moramo implementirati mutex za večnitne aplikacije. Nato smo razpravljali o sintaksi za mutex z navideznim primerom z uporabo psevdo kode. Nato smo implementirali celoten primer večnitnih aplikacij z mutexom v C++ Visual Studio.