Hacker News

Разумевање Стд:Схаред_мутек из Ц++17

Коментари

1 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News
<х1>Разумевање стд::схаред_мутек из Ц++17 <п><стронг>стд::схаред_мутек, уведен у Ц++17, је примитив за синхронизацију који омогућава да више нити истовремено држи дељене (читање) браве истовремено осигуравајући ексклузивни приступ за операције писања. Решава један од најчешћих изазова истовремености у савременом Ц++-у тако што даје програмерима чист, стандардни начин да имплементирају закључавање читача и писача без посезања за библиотекама трећих страна или АПИ-јима специфичним за платформу. <х2>Шта је тачно стд::схаред_мутек и зашто је додат у Ц++17? <п>Пре Ц++17, програмери којима је била потребна семантика читач-писач морали су да се ослањају на решења специфична за платформу као што је <цоде>птхреад_рвлоцк_т на ПОСИКС системима или <цоде>СРВЛОЦК на Виндовс-у, или би користили библиотеке трећих страна као што је Боост. Стандардни одбор Ц++17 је препознао овај недостатак и увео <цоде>стд::схаред_мутек у заглавље <цоде><схаред_мутек> да би га директно решио. <п>Основна идеја је једноставна: у многим програмима из стварног света подаци се читају много чешће него што се записују. Стандардни <цоде>стд::мутек серијализује сав приступ – укључено је и читање – што ствара непотребна уска грла. <цоде>стд::схаред_мутек укида то ограничење разликовањем између два режима закључавања: <ул> <ли><стронг>Дељено (читано) закључавање — стечено преко <цоде>лоцк_схаред(); више нити може држати ово истовремено, што га чини идеалним за истовремено читање. <ли><стронг>Ексклузивно (уписивање) закључавање — стечено преко <цоде>лоцк(); само једна нит може да држи ово истовремено и није дозвољено заједничко закључавање док се држи. <ли><стронг>стд::схаред_лоцк — РАИИ омотач који позива <цоде>лоцк_схаред() при изради и <цоде>унлоцк_схаред() приликом уништавања, спречавајући цурење ресурса. <ли><стронг>стд::уникуе_лоцк / стд::лоцк_гуард — користи се са ексклузивним режимом, осигуравајући да су операције писања потпуно заштићене и безбедне од изузетака. <п>Овај дизајн са двоструким режимом чини <цоде>стд::схаред_мутек природним погодним за сценарије као што су кеш меморије, регистри конфигурације и било која структура података у којој читања доминирају радним оптерећењем. <х2>Како користите стд::схаред_мутек у стварном коду са коментарима? <п>Коментари у коду који користи <цоде>стд::схаред_мутек су посебно вредни јер је логику конкурентности тешко разумјети. Добро постављени коментари појашњавају <ем>зашто одабран одређени тип закључавања, што драматично смањује ризик да будући одржаваоци случајно уведу трке података. Ево типичног узорка: <пре><цоде>#инцлуде <схаред_мутек> #инцлуде <унордеред_мап> #инцлуде <стринг> цласс ЦонфигРегистри { променљив стд::схаред_мутек мтк_; // штити мапу испод стд::унордеред_мап<стд::стринг, стд::стринг> дата_; јавно: // Читање путање: више нити може позвати ово истовремено стд::стринг гет(цонст стд::стринг& кеи) цонст { стд::схаред_лоцк лоцк(мтк_); // дељено закључавање — безбедно за истовремено читање ауто ит = дата_.финд(кеи); врати га != дата_.енд() ? ит->други : ""; } // Путања за писање: потребан је ексклузивни приступ воид сет(цонст стд::стринг& кеи, цонст стд::стринг& вал) { стд::уникуе_лоцк лоцк(мтк_); // ексклузивно закључавање — блокира све читаче дата_[кључ] = вал; } }; <п>Обратите пажњу на то како коментари објашњавају намеру иза сваког избора закључавања, а не само понављајући шта код ради. Ово је златни стандард: коментари треба да одговарају на <ем>зашто, а не на <ем>шта. <цоде>променљиви кључна реч на мутексу омогућава да <цоде>гет() буде проглашен за <цоде>цонст док је и даље у могућности да закључа, уобичајен и идиоматски образац. <блоцккуоте> <п><стронг>Кључни увид: Увек користите РАИИ омоте за закључавање (<цоде>стд::схаред_лоцк, <цоде>стд::уникуе_лоцк) са <цоде>стд::схаред_мутек — никада не позивајте <цоде>лоцк() и <цоде>ручно () откључавање. Ручно закључавање у присуству изузетака је гарантован пут до застоја и недефинисаног понашања. <х2>Које су уобичајене замке при раду са стд::схаред_мутек?<п>Чак и са јасним коментарима и добрим намерама, <цоде>стд::схаред_мутек има суптилне замке које саплићу искусне програмере. Најопаснија је <стронг>надоградња закључавања: не постоји уграђени начин за надоградњу дељене браве на ексклузивну браву без њеног претходног отпуштања. Покушај да се то уради без отпуштања ствара тренутни застој јер нит држи дељено закључавање док чека на ексклузивно закључавање које никада не може бити одобрено све док постоји било које дељено закључавање — укључујући и оно које држи. <п>Још једна уобичајена грешка је заштита погрешне грануларности. Програмери понекад закључавају превише широко, побеђујући сврху обрасца читач-писац, или сувише уско, остављајући прозоре у којима се крше инваријанте између две одвојене аквизиције закључавања. Коментари који описују <ем>инваријанту која је заштићена, а не само закључану променљиву, помажу тимовима да размисле о исправности током прегледа кода. <п>Учинак такође може да вас изненади. На системима са великим проблемима са много писаца, <цоде>стд::схаред_мутек може заправо радити лошије од обичног <цоде>стд::мутек због додатних трошкова књиговодства. Увек се профилишите пре него што претпоставите да је закључавање читача и писача чиста победа. <х2>Како се стд::схаред_мутек пореди са стд::мутек и другим алтернативама? <п><цоде>стд::мутек је једноставнији, бржи за добијање када је сукоб низак и прикладан када се читање и уписивање дешавају на приближно једнакој фреквенцији. <цоде>стд::схаред_мутек блиста када је број читања знатно већи од броја уписа — однос 10:1 или већи је разумно правило пре него што размислите о промени. <п>Ц++14 је увео <цоде>стд::схаред_тимед_мутек, који додаје <цоде>три_лоцк_схаред_фор() и <цоде>три_лоцк_схаред_унтил() за покушаје са временским ограничењем. Ц++17 <цоде>стд::схаред_мутек испушта временске варијанте ради штедљивије имплементације. Ако вам је потребно временско закључавање на дељеној путањи, <цоде>стд::схаред_тимед_мутек остаје доступан и оба типа су потпуно стандардна. <п>За алтернативе без закључавања, <цоде>стд::атомиц у комбинацији са пажљивим редоследом меморије понекад може у потпуности да замени мутекс за једноставне заставице или бројаче, али за сложене структуре података, <цоде>стд::схаред_мутек остаје најчитљивије решење које се може одржавати у стандардној библиотеци. <х2>Честа питања <х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.

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime