C++ Mutex-lukko

C Mutex Lukko



C ++:n tiedetään olevan yksi nopeimmista ohjelmointikielistä, jolla on hyvä suorituskyky, korkea tarkkuus ja riittävä muistinhallintajärjestelmä. Tämä ohjelmointikieli tukee myös useiden säikeiden samanaikaista suorittamista ja useiden resurssien jakamista niiden välillä. Monisäikeisessä langassa säikeen tehtävänä on vain suorittaa lukutoiminto, joka ei aiheuta ongelmia, koska muiden säikeiden tuolloin tekeminen ei vaikuta säikeeseen. Mutta jos näiden säikeiden täytyi jakaa resurssit keskenään, yksi säie voi muokata tietoja sillä hetkellä, mikä aiheuttaa ongelman. Tämän ongelman ratkaisemiseksi meillä on C++ 'Mutex', joka estää useiden resurssien pääsyn koodiimme/objektiimme tarjoamalla synkronoinnin, jonka mukaan pääsy objektiin/koodiin voidaan tarjota vain yhdelle säikeelle kerrallaan, jotta useat säikeet eivät pääse käsiksi kyseiseen objektiin samanaikaisesti.

Toimenpide:

Opimme tuntemaan kuinka voimme estää useiden säikeiden pääsyn objektiin kerralla käyttämällä mutex-lukkoa. Puhumme mutex-lukon syntaksista, mitä on usean ketjutuksen ja kuinka voimme käsitellä usean ketjutuksen aiheuttamia ongelmia mutex-lukon avulla. Sitten otamme esimerkin useista langoista ja toteutamme niihin mutex-lukon.







Syntaksi:

Jos haluamme oppia, kuinka voimme toteuttaa mutex-lukon, jotta voimme estää useiden säikeiden pääsyn samanaikaisesti kohti objektiamme tai koodiamme, voimme käyttää seuraavaa syntaksia:



$ std :: mutex mut_x

$mut_x. Lukko ( ) ;

Tyhjä funktion_nimi ( ) {

$ // koodi, jonka haluamme piilottaa useilta säikeiltä, ​​kirjoitetaan tähän

$mut_x. avaa lukituksen ( ) ;

}

Käytämme nyt tätä syntaksia valeesimerkissä ja pseudokoodissa (jota emme voi vain suorittaa sellaisena kuin se on koodieditorissa) kertoaksemme sinulle, kuinka voimme käyttää tätä syntaksia tarkasti, kuten seuraavassa mainitaan:



$ std :: mutex mut_x

Tyhjä esto ( ) {

$mut_x. Lukko ( ) ;

$ std :: cout << 'Hei' ;

$mut_x. avaa lukituksen ( ) ;

}

Esimerkki:

Tässä esimerkissä yritetään luoda ensin monisäikeinen operaatio ja sitten ympäröidä tämä toiminto mutex lock and unlock -toiminnolla, jotta toiminta synkronoidaan luodun koodin tai objektin kanssa. Mutex käsittelee kilpailuolosuhteita, jotka ovat arvoja, jotka ovat melko arvaamattomia ja ne ovat riippuvaisia ​​aikatietoisten säikeiden vaihdosta. Toteuttaaksemme esimerkin mutexille meidän on ensin tuotava tärkeät ja vaaditut kirjastot arkistoista. Vaaditut kirjastot ovat:





$ # sisältää

$ # sisältää

$ # sisältää

'iostream'-kirjasto tarjoaa meille toiminnon näyttää tiedot muodossa Cout, lukea tiedot muodossa Cin ja lopettaa käskyn nimellä endl. Käytämme 'säie'-kirjastoa hyödyntääksemme säikeistä peräisin olevia ohjelmia tai toimintoja. 'Mutex'-kirjaston avulla voimme toteuttaa sekä mutex-lukituksen että lukituksen avaamisen koodissa. Käytämme '# include', koska se sallii kaikki ohjelmat, jotka liittyvät koodiin sisältyvään kirjastoon.

Nyt, kun edellinen vaihe on tehty, määritämme mutex-luokan tai globaalin muuttujan mutexille käyttämällä std. Sitten luomme funktion mutex-lukitukselle ja lukituksen avaamiselle, jota voimme kutsua myöhemmin koodissa. Tässä esimerkissä nimeämme tämän funktion lohkoksi. Lohkofunktion rungossa kutsumme ensin 'mutex.lock()' ja alamme kirjoittaa koodin logiikkaa.



Mutex.lock() estää muiden säikeiden pääsyn luomaamme objektiin tai koodiin, joten vain yksi säie voi lukea objektiamme kerralla. Logiikassa suoritamme for-silmukan, joka kulkee indeksillä 0 - 9. Näytämme silmukan arvot. Kun tämä logiikka on luotu mutex-lukkoon sen toiminnan jälkeen tai logiikasta poistumisen jälkeen, kutsumme 'mutex.unlock()' -menetelmää. Tämän menetelmäkutsun avulla voimme avata luodun objektin lukituksen mutex-lukosta, koska objektin pääsy yhteen säikeeseen oli annettu aiemmin ja kun yksi säie on suorittanut kyseisen objektin toiminnon kerrallaan. Haluamme nyt muidenkin säikeiden pääsevän kyseiseen objektiin tai koodiin. Muuten koodimme liikkuu 'umpikuja'-tilanteessa, jolloin luotu objekti mutexin kanssa pysyy lukitussa tilanteessa ikuisesti eikä mikään muu säie pääse käsiksi kyseiseen objektiin. Näin ollen keskeneräinen toiminto jatkuu. Tämän jälkeen poistumme lohkotoiminnosta ja siirrymme päätoimintoon.

Pääasiassa näytämme yksinkertaisesti luomamme mutexin luomalla kolme säiettä käyttämällä 'std :: säiettä säiettä_nimi (kutsumme jo luotua lohkotoimintoa, jossa loimme mutexin)' nimillä lanka1, säiete2 ja säie3 jne. Tällä tavalla luodaan kolme säiettä. Yhdistämme sitten nämä kolme säiettä suoritettavaksi samanaikaisesti kutsumalla 'säikeen_nimi. liity ()' -menetelmä. Ja sitten palautamme arvon, joka on yhtä suuri kuin nolla. Edellä mainittu esimerkin selitys on toteutettu koodin muodossa, joka voidaan esittää seuraavassa kuvassa:

Koodin lähdössä voimme nähdä kaikkien kolmen säikeen suorituksen ja näytön yksitellen. Näemme, vaikka sovelluksemme kuuluu monisäikeisen luokan alle. Silti mikään säikeistä ei ole korvannut tai muokannut tietoja ja jakanut muokattua resurssia 'toimintolohkon' mutexin toteuttamisen vuoksi.

Johtopäätös

Tämä opas antaa yksityiskohtaisen selityksen C++:ssa käytetystä mutex-funktiosta. Keskustelimme, mitä ovat monisäikeiset sovellukset, mitä ongelmia joudumme kohtaamaan monisäikeisissä sovelluksissa ja miksi meidän on otettava mutex käyttöön monisäikeisissä sovelluksissa. Keskustelimme sitten mutexin syntaksista valeesimerkin kanssa käyttämällä pseudokoodia. Sitten toteutimme täydellisen esimerkin monisäikeisissä sovelluksissa mutexilla C++ Visual Studiossa.