Ц++ Мутек Лоцк

C Mutek Lock



Познато је да је Ц ++ један од најбржих програмских језика са добрим перформансама, високом прецизношћу и адекватним системом управљања меморијом. Овај програмски језик такође подржава истовремено извршавање више нити са дељењем више ресурса између њих. У вишенитности, нит је само да изврши операцију читања која не ствара проблеме јер на нит не утиче оно што друге нити раде у то време. Али ако би ове нити морале да деле ресурсе између себе, једна нит може да модификује податке у том тренутку што представља проблем. Да бисмо решили овај проблем, имамо Ц++ „Мутек“ који спречава приступ више ресурса нашем коду/објекту обезбеђујући синхронизацију која каже да приступ објекту/коду може бити обезбеђен само једној нити у исто време, тако да више нити не би могло да приступи том објекту истовремено.

Процедура:

Сазнаћемо како можемо зауставити приступ више нити једном објекту у једном тренутку користећи мутек закључавање. Разговараћемо о синтакси мутек браве, шта је вишеструко нит и како можемо да се носимо са проблемима узрокованим вишеструким нитима помоћу закључавања мутекса. Затим ћемо узети пример вишеструких нити и имплементирати мутек закључавање на њих.







Синтакса:

Ако желимо да научимо како можемо да имплементирамо закључавање мутекса тако да можемо спречити приступ више нити истовремено према нашем објекту или коду, можемо користити следећу синтаксу:



$ стд :: мутек мут_к

$мут_к. закључати ( ) ;

Воид фунц_наме ( ) {

$ // код који желимо да сакријемо од више нити би био написан овде

$мут_к. откључава ( ) ;

}

Сада ћемо користити ову синтаксу на лажном примеру и у псеудо коду (који не можемо само да покренемо као што је у уређивачу кода) да бисмо вас обавестили како тачно можемо да користимо ову синтаксу као што је поменуто у следећем:



$ стд :: мутек мут_к

Воид блоцк ( ) {

$мут_к. закључати ( ) ;

$ стд :: цоут << 'Здраво' ;

$мут_к. откључава ( ) ;

}

Пример:

У овом примеру, хајде да покушамо прво да креирамо вишенитну операцију, а затим да окружимо ову операцију закључавањем и откључавањем мутекса да бисмо обезбедили синхронизацију операције са креираним кодом или објектом. Мутек се бави условима трке који су вредности које су прилично непредвидиве и зависе од промене нити које су свесне времена. Да бисмо имплементирали пример за мутекс, прво морамо да увеземо важне и потребне библиотеке из спремишта. Потребне библиотеке су:





$ # укључује <иостреам>

$ # укључује <нит>

$ # укључује <мутек>

Библиотека „иостреам“ нам пружа функцију да прикажемо податке као Цоут, прочитамо податке као Цин и завршимо изјаву као ендл. Користимо библиотеку „нит“ да бисмо користили програме или функције из нити. Библиотека „мутекс“ нам омогућава да имплементирамо и закључавање и откључавање мутекса у коду. Користимо „# инцлуде“ јер ово дозвољава све програме који се односе на библиотеку укључене у код.

Сада, након што је претходни корак завршен, дефинишемо мутекс класу или глобалну променљиву за мутекс користећи стд. Затим креирамо функцију за закључавање и откључавање мутекса коју бисмо могли позвати касније у коду. У овом примеру ову функцију називамо блоком. У телу функције блока прво позивамо „мутек.лоцк()“ и почињемо да пишемо логику кода.



Мутек.лоцк() одбија приступ другим нитима да дођу до нашег креираног објекта или кода тако да само једна нит може читати наш објекат у исто време. У логици, покрећемо петљу фор која се покреће на индексу од 0 до 9. Приказујемо вредности у петљи. Једном када се ова логика креира у закључавању мутекса након што је операција завршена или након изласка из логике, позивамо методу „мутек.унлоцк()“. Овај позив метода нам омогућава да откључамо креирани објекат од закључавања мутекса пошто је приступ објекта једној јединој нити био раније обезбеђен и када операција на том објекту буде обављена од стране једне нити у исто време. Сада желимо да и друге нити приступе том објекту или коду. У супротном, наш код се помера у ситуацији „замртве“ што узрокује да креирани објекат са мутексом заувек остане у закључаној ситуацији и ниједна друга нит не би могла да приступи том објекту. Дакле, непотпуна операција наставља да се извршава. Након овога излазимо из функције блока и прелазимо на главну.

У главном, једноставно приказујемо наш креирани мутекс тако што креирамо три нити користећи „стд :: тхреад тхреад_наме (позивање већ креиране функције блока овде у којој смо креирали мутекс)“ са именима тхреад1, тхреад2 и тхреад3, итд. На овај начин се креирају три нити. Затим придружујемо ове три нити да се изврше истовремено позивањем „тхреад_наме. метода придружи ()”. И онда, враћамо вредност једнаку нули. Претходно поменуто објашњење примера имплементирано је у облику кода који се може приказати на следећој слици:

У излазу кода можемо видети извршавање и приказ све три нити један по један. Можемо видети чак и да ли наша апликација спада у категорију вишенитног рада. Ипак, ниједна од нити није преписала или модификовала податке и поделила измењени ресурс због имплементације мутекса „функционалног блока“.

Закључак

Овај водич даје детаљно објашњење концепта мутек функције која се користи у Ц++. Разговарали смо о томе шта су вишенитне апликације, на које проблеме морамо да се сусрећемо у вишенитним апликацијама и зашто морамо да имплементирамо мутекс за вишенитне апликације. Затим смо разговарали о синтакси за мутекс са лажним примером користећи псеудокод. Затим смо имплементирали комплетан пример на вишенитне апликације са мутексом у Ц++ визуелном студију.