C++ Mutex slēdzene

C Mutex Sledzene



Ir zināms, ka C ++ ir viena no ātrākajām programmēšanas valodām ar labu veiktspēju, augstu precizitāti un atbilstošu atmiņas pārvaldības sistēmu. Šī programmēšanas valoda atbalsta arī vairāku pavedienu vienlaicīgu izpildi ar vairāku resursu koplietošanu starp tiem. Izmantojot vairākpavedienu, pavedienam ir jāveic tikai lasīšanas darbība, kas nerada problēmas, jo pavedienu neietekmē tas, ko tajā laikā dara citi pavedieni. Bet, ja šiem pavedieniem bija jādala resursi starp tiem, viens pavediens var modificēt datus tajā laikā, kas rada problēmu. Lai risinātu šo problēmu, mums ir C++ “Mutex”, kas neļauj vairākiem resursiem piekļūt mūsu kodam/objektam, nodrošinot sinhronizāciju, kas nosaka, ka piekļuvi objektam/kodam var nodrošināt tikai vienam pavedienam vienlaikus, lai vairāki pavedieni nevarētu vienlaikus piekļūt šim objektam.

Procedūra:

Mēs uzzināsim, kā mēs varam apturēt vairāku pavedienu piekļuvi objektam vienā reizē, izmantojot mutex lock. Mēs runāsim par mutex bloķēšanas sintaksi, kas ir vairāku pavedienu izveidošana un kā mēs varam risināt problēmas, ko izraisa vairāku pavedienu pievienošana, izmantojot mutex bloķēšanu. Pēc tam mēs ņemsim vairāku pavedienu piemēru un ieviesīsim tajos mutex bloķēšanu.







Sintakse:

Ja mēs vēlamies uzzināt, kā mēs varam ieviest mutex bloķēšanu, lai mēs varētu novērst vairāku pavedienu piekļuvi vienlaikus mūsu objektam vai kodam, mēs varam izmantot šādu sintaksi:



$ std :: mutex mut_x

$mut_x. slēdzene ( ) ;

Nederīgs funkcijas_nosaukums ( ) {

$ // kods, kuru vēlamies paslēpt no vairākiem pavedieniem, tiks rakstīts šeit

$mut_x. atslēdz ( ) ;

}

Tagad mēs izmantosim šo sintaksi fiktīvajā piemērā un pseidokodā (kuru mēs nevaram palaist tā, kā tas ir koda redaktorā), lai informētu jūs, kā mēs varam precīzi izmantot šo sintaksi, kā minēts tālāk:



$ std :: mutex mut_x

Tukšs bloks ( ) {

$mut_x. slēdzene ( ) ;

$ std :: cout << 'Sveiki' ;

$mut_x. atslēdz ( ) ;

}

Piemērs:

Šajā piemērā vispirms mēģināsim izveidot vairākpavedienu darbību un pēc tam ieskauj šo darbību ar mutex bloķēšanu un atbloķēšanu, lai nodrošinātu darbības sinhronizāciju ar izveidoto kodu vai objektu. Mutex nodarbojas ar sacensību apstākļiem, kas ir vērtības, kas ir diezgan neparedzamas, un tās ir atkarīgas no laika apzināto pavedienu pārslēgšanās. Lai ieviestu mutex piemēru, mums vispirms ir jāimportē svarīgās un nepieciešamās bibliotēkas no krātuvēm. Nepieciešamās bibliotēkas ir:





$ # ietver

$ # iekļaut

$ # ietver

“iostream” bibliotēka nodrošina mums funkciju, lai parādītu datus kā Cout, nolasītu datus kā Cin un pārtrauktu paziņojumu kā endl. Mēs izmantojam “pavedienu” bibliotēku, lai izmantotu programmas vai funkcijas no pavedieniem. “Mutex” bibliotēka ļauj kodā ieviest gan mutex bloķēšanu, gan atbloķēšanu. Mēs izmantojam “# iekļaut”, jo tas ļauj izmantot visas programmas, kas saistītas ar kodā iekļauto bibliotēku.

Tagad, pēc iepriekšējās darbības veikšanas, mēs definējam mutex klasi vai globālo mainīgo mutex, izmantojot std. Pēc tam mēs izveidojam funkciju mutex bloķēšanai un atbloķēšanai, ko mēs varētu pēc tam izsaukt kodā. Šajā piemērā mēs šo funkciju nosaucam par bloku. Bloka funkcijas pamattekstā mēs vispirms izsaucam “mutex.lock()” un sākam rakstīt koda loģiku.



Mutex.lock() liedz piekļuvi citiem pavedieniem, lai sasniegtu mūsu izveidoto objektu vai kodu, tādējādi tikai viens pavediens var nolasīt mūsu objektu vienlaikus. Loģikā mēs palaižam for cilpu, kas darbojas indeksā no 0 līdz 9. Mēs parādām cilpas vērtības. Kad šī loģika ir izveidota mutex slēdzenē pēc tās darbības pabeigšanas vai pēc iziešanas no loģikas, mēs izsaucam metodi “mutex.unlock()”. Šis metodes izsaukums ļauj mums atbloķēt izveidoto objektu no mutex bloķēšanas, jo objekta piekļuve vienam pavedienam tika nodrošināta agrāk un, ja darbību ar šo objektu vienlaikus veic viens pavediens. Tagad mēs vēlamies, lai arī citi pavedieni piekļūtu šim objektam vai kodam. Pretējā gadījumā mūsu kods pārvietojas strupceļa situācijā, kā rezultātā izveidotais objekts ar mutex paliek bloķētā situācijā uz visiem laikiem un neviens cits pavediens nevarēs piekļūt šim objektam. Tādējādi nepabeigta darbība turpina izpildīt. Pēc tam mēs izejam no bloķēšanas funkcijas un pārejam uz galveno.

Pamatā mēs vienkārši parādām mūsu izveidoto mutex, izveidojot trīs pavedienus, izmantojot “std :: pavedienu pavediena_nosaukums (šeit izsaucot jau izveidoto bloka funkciju, kurā mēs izveidojām mutex)” ar nosaukumiem pavediens1, pavediens2 un pavediens3 utt. Tādā veidā tiek izveidoti trīs pavedieni. Pēc tam mēs savienojam šos trīs pavedienus, lai tie tiktu izpildīti vienlaikus, izsaucot “pavediena_nosaukums. pievienoties ()” metodi. Un tad mēs atgriežam vērtību, kas vienāda ar nulli. Iepriekš minētais piemēra skaidrojums ir realizēts koda veidā, ko var parādīt sekojošā attēlā:

Koda izvadā mēs varam redzēt visu trīs pavedienu izpildi un parādīšanu pa vienam. Mēs varam redzēt, pat ja mūsu lietojumprogramma ietilpst vairāku pavedienu kategorijā. Tomēr neviens no pavedieniem nav pārrakstījis vai modificējis datus un koplietojis modificēto resursu, jo ir ieviests “funkciju bloka” mutex.

Secinājums

Šī rokasgrāmata sniedz detalizētu skaidrojumu par mutex funkcijas jēdzienu, ko izmanto C++. Mēs apspriedām, kas ir daudzpavedienu lietojumprogrammas, ar kādām problēmām nākas saskarties daudzpavedienu lietojumprogrammās un kāpēc mums ir jāievieš mutex daudzpavedienu lietojumprogrammām. Pēc tam mēs apspriedām mutex sintaksi ar fiktīvu piemēru, izmantojot pseidokodu. Pēc tam mēs ieviesām pilnīgu piemēru daudzpavedienu lietojumprogrammām ar mutex C++ vizuālajā studijā.