C++ Mutex-lukk

C Mutex Lukk



C ++ on teadaolevalt üks kiiremaid programmeerimiskeeli, millel on hea jõudlus, suur täpsus ja piisav mäluhaldussüsteem. See programmeerimiskeel toetab ka mitme lõime samaaegset täitmist, jagades nende vahel mitut ressurssi. Mitme lõime puhul on lõim ainult lugemistoimingu tegemiseks, mis ei tekita probleeme, kuna lõime ei mõjuta see, mida teised lõimed sel ajal teevad. Kuid kui need lõimed pidid omavahel ressursse jagama, saab üks lõim sel ajal andmeid muuta, mis põhjustab probleemi. Selle probleemi lahendamiseks on meil C++ 'Mutex', mis takistab mitme ressursi juurdepääsu meie koodile/objektile, pakkudes sünkroonimist, mis ütleb, et juurdepääsu objektile/koodile saab korraga pakkuda ainult ühele lõimele, nii et mitu lõime ei pääseks sellele objektile korraga juurde.

Menetlus:

Saame teada, kuidas saame mutex-luku abil peatada mitme lõime juurdepääsu objektile korraga. Räägime mutex-luku süntaksist, sellest, mis on mitme keermestamine ja kuidas saame lahendada mitme keermestamise põhjustatud probleeme mutex-luku abil. Seejärel võtame mitme keermestamise näite ja rakendame neile mutex-luku.







Süntaks:

Kui tahame õppida, kuidas rakendada mutex-lukku, et saaksime takistada mitme lõime samaaegset juurdepääsu meie objektile või koodile, võime kasutada järgmist süntaksit:



$ std :: mutex mut_x

$mut_x. lukk ( ) ;

Func_name kehtetu ( ) {

$ // kood, mida tahame mitme lõime eest peita, kirjutataks siia

$mut_x. avab lukud ( ) ;

}

Nüüd kasutame seda süntaksit näidisnäites ja pseudokoodis (mida me ei saa lihtsalt käivitada nii, nagu see on koodiredaktoris), et anda teile teada, kuidas saame seda süntaksit täpselt kasutada, nagu on mainitud järgmises:



$ std :: mutex mut_x

Tühi blokk ( ) {

$mut_x. lukk ( ) ;

$ std :: cout << 'Tere' ;

$mut_x. avab lukud ( ) ;

}

Näide:

Selles näites proovime esmalt luua mitme lõime toimingu ja seejärel ümbritseda see toiming mutex lock and unlockiga, et tagada toimingu sünkroonimine loodud koodi või objektiga. Mutex tegeleb võistlustingimustega, mille väärtused on üsna ettearvamatud ja sõltuvad ajateadlike lõimede ümberlülitamisest. Mutexi näite rakendamiseks peame esmalt importima hoidlatest olulised ja nõutavad teegid. Nõutavad raamatukogud on:





$ # sisaldab

$ # sisaldab

$ # sisaldab

Teek 'iostream' pakub meile funktsiooni andmete kuvamiseks Cout-vormingus, andmete lugemiseks Cin-ina ja avalduse lõpetamiseks kui endl. Me kasutame lõimede programmide või funktsioonide kasutamiseks 'lõime' teeki. 'Mutexi' teek võimaldab meil koodis rakendada nii mutexi lukustamist kui ka avamist. Kasutame '# include', kuna see võimaldab kõiki koodis sisalduva teegiga seotud programme.

Nüüd, pärast eelmise sammu tegemist, määratleme mutexi klassi või globaalse muutuja mutexi jaoks, kasutades std. Seejärel loome mutexi lukustamise ja avamise funktsiooni, mida saaksime hiljem koodis välja kutsuda. Selles näites nimetame selle funktsiooni plokiks. Plokifunktsiooni põhiosas kutsume esmalt välja “mutex.lock()” ja hakkame kirjutama koodi loogikat.



Mutex.lock() keelab teiste lõimede juurdepääsu meie loodud objektile või koodile, nii et ainult üks lõim saab korraga meie objekti lugeda. Loogikas käivitame for-tsükli, mis jookseb indeksil vahemikus 0 kuni 9. Kuvame tsükli väärtused. Kui see loogika on loodud mutexi lukus pärast selle toimimist või pärast loogikast väljumist, kutsume välja meetodi 'mutex.unlock()'. See meetodi kutse võimaldab meil loodud objekti mutexi lukust lahti lukustada, kuna objekti juurdepääs ühele lõimele oli varem antud ja kui selle objektiga toimingu teeb üks lõime korraga. Nüüd tahame, et ka teised lõimed pääseksid sellele objektile või koodile juurde. Vastasel juhul liigub meie kood ummikusituatsioonis, mille tõttu jääb mutexiga loodud objekt igaveseks lukustatud olukorda ja ükski teine ​​lõim ei pääse sellele objektile juurde. Seetõttu jätkatakse mittetäieliku toimingu täitmist. Pärast seda väljume blokeerimisfunktsioonist ja liigume põhifunktsiooni.

Peamiselt kuvame lihtsalt oma loodud mutexi, luues kolm lõime, kasutades 'std :: lõime lõime_nimi (kutsudes siin juba loodud plokifunktsiooni, milles me lõime mutexi)' nimedega lõime1, lõime2 ja lõime3 jne. Nii luuakse kolm lõime. Seejärel ühendame need kolm lõime, et neid üheaegselt käivitada, kutsudes välja 'lõime_nimi. liitu ()” meetodil. Ja siis tagastame väärtuse, mis on võrdne nulliga. Eelnevalt mainitud näite selgitus on realiseeritud koodi kujul, mida saab näidata järgmisel joonisel:

Koodi väljundis näeme ükshaaval kõigi kolme lõime täitmist ja kuvamist. Näeme isegi seda, kas meie rakendus kuulub mitme lõimestamise kategooriasse. Sellegipoolest pole ükski lõimedest andmeid üle kirjutanud ega muutnud ega jaganud muudetud ressurssi funktsiooniploki mutexi rakendamise tõttu.

Järeldus

See juhend annab üksikasjaliku selgituse C++-s kasutatava mutex-funktsiooni kontseptsiooni kohta. Arutasime, millised on mitme lõimega rakendused, milliste probleemidega peame mitme lõimega rakendustes kokku puutuma ja miks peame mitme lõimega rakenduste jaoks mutexi juurutama. Seejärel arutasime mutexi süntaksit näiva näitega, kasutades pseudokoodi. Seejärel rakendasime C++ visuaalses stuudios mutexiga mitme lõimega rakenduste täieliku näite.