<х1>Разумевање стд::схаред_мутек из Ц++17х1>
<п><стронг>стд::схаред_мутекстронг>, уведен у Ц++17, је примитив за синхронизацију који омогућава да више нити истовремено држи дељене (читање) браве истовремено осигуравајући ексклузивни приступ за операције писања. Решава један од најчешћих изазова истовремености у савременом Ц++-у тако што даје програмерима чист, стандардни начин да имплементирају закључавање читача и писача без посезања за библиотекама трећих страна или АПИ-јима специфичним за платформу.п>
<х2>Шта је тачно стд::схаред_мутек и зашто је додат у Ц++17?х2>
<п>Пре Ц++17, програмери којима је била потребна семантика читач-писач морали су да се ослањају на решења специфична за платформу као што је <цоде>птхреад_рвлоцк_тцоде> на ПОСИКС системима или <цоде>СРВЛОЦКцоде> на Виндовс-у, или би користили библиотеке трећих страна као што је Боост. Стандардни одбор Ц++17 је препознао овај недостатак и увео <цоде>стд::схаред_мутекцоде> у заглавље <цоде><схаред_мутек>цоде> да би га директно решио.п>
<п>Основна идеја је једноставна: у многим програмима из стварног света подаци се читају много чешће него што се записују. Стандардни <цоде>стд::мутекцоде> серијализује сав приступ – укључено је и читање – што ствара непотребна уска грла. <цоде>стд::схаред_мутекцоде> укида то ограничење разликовањем између два режима закључавања:п>
<ул>
<ли><стронг>Дељено (читано) закључавањестронг> — стечено преко <цоде>лоцк_схаред()цоде>; више нити може држати ово истовремено, што га чини идеалним за истовремено читање.ли>
<ли><стронг>Ексклузивно (уписивање) закључавањестронг> — стечено преко <цоде>лоцк()цоде>; само једна нит може да држи ово истовремено и није дозвољено заједничко закључавање док се држи.ли>
<ли><стронг>стд::схаред_лоцкстронг> — РАИИ омотач који позива <цоде>лоцк_схаред()цоде> при изради и <цоде>унлоцк_схаред()цоде> приликом уништавања, спречавајући цурење ресурса.ли>
<ли><стронг>стд::уникуе_лоцк / стд::лоцк_гуардстронг> — користи се са ексклузивним режимом, осигуравајући да су операције писања потпуно заштићене и безбедне од изузетака.ли>
ул>
<п>Овај дизајн са двоструким режимом чини <цоде>стд::схаред_мутекцоде> природним погодним за сценарије као што су кеш меморије, регистри конфигурације и било која структура података у којој читања доминирају радним оптерећењем.п>
<х2>Како користите стд::схаред_мутек у стварном коду са коментарима?х2>
<п>Коментари у коду који користи <цоде>стд::схаред_мутекцоде> су посебно вредни јер је логику конкурентности тешко разумјети. Добро постављени коментари појашњавају <ем>заштоем> одабран одређени тип закључавања, што драматично смањује ризик да будући одржаваоци случајно уведу трке података. Ево типичног узорка:п>
<пре><цоде>#инцлуде <схаред_мутек>
#инцлуде <унордеред_мап>
#инцлуде <стринг>
цласс ЦонфигРегистри {
променљив стд::схаред_мутек мтк_; // штити мапу испод
стд::унордеред_мап<стд::стринг, стд::стринг> дата_;
јавно:
// Читање путање: више нити може позвати ово истовремено
стд::стринг гет(цонст стд::стринг& кеи) цонст {
стд::схаред_лоцк лоцк(мтк_); // дељено закључавање — безбедно за истовремено читање
ауто ит = дата_.финд(кеи);
врати га != дата_.енд() ? ит->други : "";
}
// Путања за писање: потребан је ексклузивни приступ
воид сет(цонст стд::стринг& кеи, цонст стд::стринг& вал) {
стд::уникуе_лоцк лоцк(мтк_); // ексклузивно закључавање — блокира све читаче
дата_[кључ] = вал;
}
};цоде>пре>
<п>Обратите пажњу на то како коментари објашњавају намеру иза сваког избора закључавања, а не само понављајући шта код ради. Ово је златни стандард: коментари треба да одговарају на <ем>заштоем>, а не на <ем>штаем>. <цоде>променљивицоде> кључна реч на мутексу омогућава да <цоде>гет()цоде> буде проглашен за <цоде>цонстцоде> док је и даље у могућности да закључа, уобичајен и идиоматски образац.п>
<блоцккуоте>
<п><стронг>Кључни увид:стронг> Увек користите РАИИ омоте за закључавање (<цоде>стд::схаред_лоцкцоде>, <цоде>стд::уникуе_лоцкцоде>) са <цоде>стд::схаред_мутекцоде> — никада не позивајте <цоде>лоцк()цоде> и <цоде>ручно () откључавање. Ручно закључавање у присуству изузетака је гарантован пут до застоја и недефинисаног понашања.п>
блоцккуоте>
<х2>Које су уобичајене замке при раду са стд::схаред_мутек?х2><п>Чак и са јасним коментарима и добрим намерама, <цоде>стд::схаред_мутекцоде> има суптилне замке које саплићу искусне програмере. Најопаснија је <стронг>надоградња закључавањастронг>: не постоји уграђени начин за надоградњу дељене браве на ексклузивну браву без њеног претходног отпуштања. Покушај да се то уради без отпуштања ствара тренутни застој јер нит држи дељено закључавање док чека на ексклузивно закључавање које никада не може бити одобрено све док постоји било које дељено закључавање — укључујући и оно које држи.п>
<п>Још једна уобичајена грешка је заштита погрешне грануларности. Програмери понекад закључавају превише широко, побеђујући сврху обрасца читач-писац, или сувише уско, остављајући прозоре у којима се крше инваријанте између две одвојене аквизиције закључавања. Коментари који описују <ем>инваријанту која је заштићенаем>, а не само закључану променљиву, помажу тимовима да размисле о исправности током прегледа кода.п>
<п>Учинак такође може да вас изненади. На системима са великим проблемима са много писаца, <цоде>стд::схаред_мутекцоде> може заправо радити лошије од обичног <цоде>стд::мутекцоде> због додатних трошкова књиговодства. Увек се профилишите пре него што претпоставите да је закључавање читача и писача чиста победа.п>
<х2>Како се стд::схаред_мутек пореди са стд::мутек и другим алтернативама?х2>
<п><цоде>стд::мутекцоде> је једноставнији, бржи за добијање када је сукоб низак и прикладан када се читање и уписивање дешавају на приближно једнакој фреквенцији. <цоде>стд::схаред_мутекцоде> блиста када је број читања знатно већи од броја уписа — однос 10:1 или већи је разумно правило пре него што размислите о промени.п>
<п>Ц++14 је увео <цоде>стд::схаред_тимед_мутекцоде>, који додаје <цоде>три_лоцк_схаред_фор()цоде> и <цоде>три_лоцк_схаред_унтил()цоде> за покушаје са временским ограничењем. Ц++17 <цоде>стд::схаред_мутекцоде> испушта временске варијанте ради штедљивије имплементације. Ако вам је потребно временско закључавање на дељеној путањи, <цоде>стд::схаред_тимед_мутекцоде> остаје доступан и оба типа су потпуно стандардна.п>
<п>За алтернативе без закључавања, <цоде>стд::атомиццоде> у комбинацији са пажљивим редоследом меморије понекад може у потпуности да замени мутекс за једноставне заставице или бројаче, али за сложене структуре података, <цоде>стд::схаред_мутекцоде> остаје најчитљивије решење које се може одржавати у стандардној библиотеци.п>
<х2>Честа питањах2>
<х3>Може ли стд::схаред_мутек изазвати гладовање?х3>
<п>Да, може. Ако нови држачи дељених закључавања стално пристижу, подносилац захтева за ексклузивно закључавање може да чека неограничено време – класичан проблем <ем>изгладњивања писцаем>. Ц++ стандард не налаже посебну политику праведности, тако да понашање зависи од имплементације. У пракси, већина имплементација стандардних библиотека даје приоритет ексклузивним закључавањима на чекању након што се ставе у ред чекања, али то би требало да проверите за свој специфични ланац алата и платформу ако је гладовање проблем у производњи.п>
<х3>Да ли је стд::схаред_мутек безбедан за коришћење са стд::цондитион_вариабле?х3>
<п><цоде>стд::цондитион_вариаблецоде> захтева <цоде>стд::уникуе_лоцк<стд::мутек>цоде>, тако да није директно компатибилан са <цоде>стд::схаред_мутекцоде>. Ако треба да сачекате на услов док држите дељени мутекс, користите <цоде>стд::цондитион_вариабле_аницоде>, који ради са било којим типом БасицЛоцкабле, укључујући <цоде>стд::схаред_мутекцоде> упарен са <цоде>стд::схаред_лоцкцоде>.п>
<х3>Да ли треба да додам коментаре сваки пут када користим стд::схаред_мутек?х3>
<п>У најмању руку, коментаришите декларацију мутекса да бисте описали које податке штити и инваријанте које одржава. На свакој локацији за закључавање, кратак коментар који објашњава зашто је изабран дељени у односу на ексклузивни приступ додаје значајну вредност за рецензенте кода и будуће одржаваоце. Грешке истовремености су међу најтеже за репродукцију и исправљање, тако да се улагање у јасне, прецизне коментаре вишеструко исплати.п><хр>
<п>Управљање сложеним системима — било да је то истовремени Ц++ код или читава пословна операција — захтева праве алате и јасну структуру. <стронг>Меваизстронг> је пословни ОС са 207 модула коме верује више од 138.000 корисника да би донео исту јасноћу у маркетинг, ЦРМ, е-трговину, аналитику и још много тога, све на једној платформи почевши од само 19 УСД месечно. Престаните да жонглирате са десетинама неповезаних алата и почните да водите свој посао уз прецизност добро дизајнираног софтвера. <а хреф="хттпс://апп.меваиз.цом"><стронг>Испробајте Меваиз данас на апп.меваиз.цомстронг>а> и видите како обједињени систем трансформише начин на који ваш тим функционише.п>
<сцрипт типе="апплицатион/лд+јсон">{"@цонтект":"хттпс:\/\/сцхема.орг","@типе":"ФАКПаге","маинЕнтити":[{"@типе":"Куестион","наме":"Може ли стд::схаред_мутек да изазове гладовање?","аццептедАнсвер:":"аццептедАнсвер:"ес" Ако нови држачи дељених закључавања стално пристижу, захтев за ексклузивно закључавање може да чека на неодређено време \у2014 класични проблем за писање. ф"}},{"@типе":"Питање","наме":"Да ли је стд::схаред_мутек безбедан за коришћење са стд::цондитион_вариабле?","аццептедАнсвер":{"@типе":"Одговор","тект":"стд::цондитион_вариабле захтева стд::стд::уникуе:мутек није директно са стд:>уникуе:мутек стд::схаред_мутек Ако треба да сачекате услов док држите дељени мутек, користите стд::цондитион_вариабле_ани, који ради са било којим типом БасицЛоцкабле, укључујући стд::схаред_мутек упарен са стд::схаред_лоцк."}},{"@типе":"Куестион":"Сваки пут користим коментар". стд::схаред_мутек?","аццептедАнсвер":{"@типе":"Ансвер","тект":"У најмању руку, прокоментаришите декларацију мутекса да бисте описали које податке штити и које инваријанте одржава репродукујте и поправљајте, тако да улагање у јасне, прецизне коментаре доноси многе дивиденде "}}]}сцрипт>
Try Mewayz Free
All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.