C++ Mutex užraktas

C Mutex Uzraktas



Yra žinoma, kad C ++ yra viena greičiausių programavimo kalbų, pasižyminti geru našumu, dideliu tikslumu ir tinkama atminties valdymo sistema. Ši programavimo kalba taip pat palaiko kelių gijų vykdymą vienu metu, dalijantis keliais ištekliais tarp jų. Naudojant kelių gijų, gija turi atlikti tik skaitymo operaciją, kuri nesukelia problemų, nes gijai neturi įtakos tai, ką tuo metu daro kitos gijos. Bet jei šios gijos turėjo dalytis ištekliais, viena gija gali tuo metu keisti duomenis, dėl kurių kyla problema. Norėdami išspręsti šią problemą, turime C++ „Mutex“, kuri neleidžia prieiti prie daugelio išteklių prie mūsų kodo / objekto, pateikdama sinchronizavimą, kuris teigia, kad prieiga prie objekto / kodo vienu metu gali būti suteikta tik vienai gijai, kad kelios gijos negalėtų pasiekti šio objekto vienu metu.

Procedūra:

Sužinosime, kaip galime sustabdyti kelių gijų prieigą prie objekto vienu metu naudojant „mutex lock“. Kalbėsime apie „mutex“ užrakto sintaksę, kas yra kelių gijų sujungimas ir kaip galime išspręsti problemas, kylančias dėl kelių gijų sujungimo naudojant „mutex“ užraktą. Tada paimsime kelių sriegių sujungimo pavyzdį ir įdiegsime juose mutex užraktą.







Sintaksė:

Jei norime sužinoti, kaip galime įdiegti „mutex“ užraktą, kad galėtume užkirsti kelią kelių gijų prieigai prie mūsų objekto ar kodo vienu metu, galime naudoti šią sintaksę:



$ std :: mutex mut_x

$mut_x. užraktas ( ) ;

Func_name negalioja ( ) {

$ // kodas, kurį norime paslėpti nuo kelių gijų, būtų parašytas čia

$mut_x. atrakina ( ) ;

}

Dabar šią sintaksę naudosime netikrame pavyzdyje ir pseudo kode (kurio negalime paleisti taip, kaip yra kodo rengyklėje), kad žinotume, kaip galime tiksliai naudoti šią sintaksę, kaip nurodyta toliau:



$ std :: mutex mut_x

Tuščias blokas ( ) {

$mut_x. užraktas ( ) ;

$ std :: cout << 'Sveiki' ;

$mut_x. atrakina ( ) ;

}

Pavyzdys:

Šiame pavyzdyje pirmiausia pabandykime sukurti kelių gijų operaciją, o tada apjuoskite šią operaciją su „mutex lock and unlock“, kad operacija būtų sinchronizuota su sukurtu kodu ar objektu. Mutex susijęs su lenktynių sąlygomis, kurios yra gana nenuspėjamos vertės ir priklauso nuo laiko suvokimo gijų perjungimo. Norėdami įgyvendinti mutex pavyzdį, pirmiausia turime importuoti svarbias ir reikalingas bibliotekas iš saugyklų. Reikalingos bibliotekos yra:





$ # įtraukti

$ # įtraukti

$ # įtraukti

„iostream“ biblioteka suteikia mums funkciją rodyti duomenis kaip Cout, skaityti duomenis kaip Cin ir nutraukti teiginį kaip endl. Mes naudojame „gijų“ biblioteką, kad galėtume panaudoti gijų programas ar funkcijas. „Mutex“ biblioteka leidžia kode įdiegti ir mutex užraktą, ir atrakinimą. Naudojame „# įtraukti“, nes tai leidžia naudoti visas su biblioteka susijusias programas, įtrauktas į kodą.

Dabar, atlikę ankstesnį veiksmą, apibrėžiame mutex klasę arba visuotinį mutex kintamąjį naudodami std. Tada sukuriame mutex užrakinimo ir atrakinimo funkciją, kurią vėliau galėtume iškviesti kode. Šiame pavyzdyje šią funkciją pavadiname kaip bloką. Blokavimo funkcijos turinyje pirmiausia iškviečiame „mutex.lock()“ ir pradedame rašyti kodo logiką.



Mutex.lock() neleidžia kitoms gijomis pasiekti mūsų sukurtą objektą arba kodą, kad tik viena gija galėtų skaityti mūsų objektą vienu metu. Logikoje paleidžiame for kilpą, kuri veikia indekse nuo 0 iki 9. Rodome reikšmes cikle. Kai ši logika sukuriama „mutex“ užrakte po jos veikimo arba išėjus iš logikos, mes iškviečiame metodą „mutex.unlock()“. Šis metodo iškvietimas leidžia atrakinti sukurtą objektą iš mutex užrakto, nes objekto prieiga prie vienos gijos buvo suteikta anksčiau ir operaciją su tuo objektu vienu metu atlieka viena gija. Dabar norime, kad ir kitos gijos pasiektų tą objektą ar kodą. Priešingu atveju mūsų kodas juda „aklavietės“ ​​situacijoje, dėl kurios sukurtas objektas su mutex visam laikui lieka užrakintoje situacijoje ir jokia kita gija negalės pasiekti to objekto. Taigi neužbaigta operacija ir toliau vykdoma. Po to išeiname iš blokavimo funkcijos ir pereiname prie pagrindinio.

Iš esmės mes tiesiog rodome savo sukurtą mutex, sukurdami tris gijas naudodami 'std :: gijos gijos_pavadinimas (čia iškviečiame jau sukurtą bloko funkciją, kurioje sukūrėme mutex)' su pavadinimais thread1, thread2 ir thread3 ir tt Tokiu būdu sukuriamos trys gijos. Tada sujungiame šias tris gijas, kad jos būtų vykdomos vienu metu, iškviesdami „thread_name. prisijungti ()“ metodas. Ir tada grąžiname vertę, lygią nuliui. Anksčiau minėtas pavyzdžio paaiškinimas yra įgyvendintas kodo forma, kuri gali būti parodyta šiame paveikslėlyje:

Kodo išvestyje galime matyti visų trijų gijų vykdymą ir atvaizdavimą po vieną. Mes matome, net jei mūsų programa patenka į kelių gijų kategoriją. Vis dėlto nė viena gija neperrašė ar nepakeitė duomenų ir nepasidalijo modifikuotu ištekliu, nes buvo įdiegtas „funkcinio bloko“ nutildymas.

Išvada

Šiame vadove pateikiamas išsamus mutex funkcijos, naudojamos C++, sąvokos paaiškinimas. Aptarėme, kas yra kelių sriegių programos, su kokiomis problemomis susiduriame kelių sriegių programose ir kodėl turime įdiegti daugiasriegių programų mutex. Tada mes aptarėme mutex sintaksę su netikru pavyzdžiu, naudodami pseudo kodą. Tada įdiegėme pilną pavyzdį daugiasriegių programų su mutex C++ vaizdo studijoje.