Hacker News

Std-e düşünmek: C ++ 17-den paýlaşylan_mutex

Teswirler

8 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

C ++ 17

-den std :: shared_mutex düşünmek C ++ 17-de hödürlenen

std :: shared_mutex , sinhronizasiýa başlangyjy bolup, ýazuw amallary üçin aýratyn elýeterliligi üpjün etmek bilen bir hatarda köp sapaklaryň umumy (okalýan) gulplary saklamaga mümkinçilik berýär. Häzirki zaman C ++ -da iň köp ýaýran ylalaşyk kynçylyklarynyň birini döredijilere üçünji tarap kitaphanalaryna ýa-da platforma ýörite API-lerine ýetmän okyjy-ýazyjy gulpuny açmagyň arassa, adaty usulyny çözýär.

Std :: paýlaşylan_mutex we näme üçin C ++ 17-de goşuldy?

C ++ 17-den öň, okyjy-ýazyjy semantikasyna mätäç döredijiler, POSIX ulgamlarynda pthread_rwlock_t ýa-da Windows-da SRWLOCK ýaly platforma çözgütlerine bil baglamalydy, ýa-da Boost ýaly üçünji tarap kitaphanalaryny ulanardylar. C ++ 17 standart komiteti bu boşlugy ykrar etdi we gönüden-göni çözmek üçin sözbaşysynda std :: shared_mutex girizdi.

Esasy ideýa gönümel: hakyky dünýä programmalarynyň köpüsinde maglumatlar ýazylanyndan has ýygy okalýar. Adaty std :: mutex ähli girişi seriýalaşdyrýar - okalýar - gereksiz päsgelçilikleri döredýär. std :: shared_mutex iki gulplama re betweenimini tapawutlandyrmak arkaly bu çäklendirmäni aýyrýar:

  • Paýlaşylan (oka) gulp - lock_shared () arkaly gazanylýar; köp sapak bir wagtyň özünde saklap biler, şol bir wagtyň özünde okamak üçin ideal bolar.
  • Exclusive (ýazmak) gulpy - lock () arkaly gazanylýar; bir gezekde diňe bir sapak saklap biler we tutulanda umumy gulplara rugsat berilmeýär.
  • std :: shared_lock - gurluşykda lock_shared () we weýrançylykda unlock_shared () çagyrýan RAII örtük.
  • std :: unique_lock / std :: lock_guard - ýazuw amallarynyň doly goralýandygyny we kadadan çykma üpjün edilmegini üpjün edýän aýratyn re modeim bilen ulanylýar.

Bu goşa re modeimli dizaýn, std :: shared_mutex keşler, konfigurasiýa registrleri we okalýan islendik maglumat gurluşy ýaly iş ssenariýalaryna tebigy laýyk gelýär.

Teswirler bilen hakyky kodda std :: shared_mutex nädip ulanýarsyňyz?

std :: shared_mutex ulanýan koddaky düşündirişler aýratyn gymmatly, sebäbi ylalaşyk logikasy barada pikir etmek gaty kyn. Gowy ýerleşdirilen teswirler näme üçin belli bir gulp görnüşiniň saýlanandygyny aýdyňlaşdyrýar, bu geljekki hyzmatçylaryň tötänleýin maglumat ýaryşlaryny girizmek howpuny ep-esli azaldar. Ine adaty bir nagyş:

  # goşuň 
# goşuň 
# goşuň

“ConfigRegistry” synpy
    üýtgäp bilýän std :: shared_mutex mtx_; // aşakdaky kartany goraýar
    std :: tertipsiz_map  data_;

köpçülik:
    // Pathol oka: birnäçe sapak bir wagtda jaň edip biler
    std :: string get (const std :: string & key) const {
        std :: shared_lock gulp (mtx_); // umumy gulp - şol bir wagtyň özünde okamak üçin howpsuz
        awtomatik = data_.find (açar);
        yzyna gaýtaryň! = data_.end ()? it-> ikinji: "";
    }

    // pathol ýazyň: aýratyn giriş zerur
    boşluk toplumy (const std :: string & key, const std :: string & val) {
        std :: unique_lock gulpy (mtx_); // aýratyn gulp - ähli okyjylary bloklaýar
        data_ [açar] = val;
    }
};  

Teswirleriň diňe koduň näme edýändigini gaýtalamazdan, her gulp saýlamasynyň niýetini nädip düşündirýändigine üns beriň. Bu altyn standart: teswirler näme däl-de, näme üçin jogap bermelidir. Muteeksdäki üýtgedilip bilinýän açar söz, umumy we manysyz nagyş, henizem gulplap bilýän wagtyňyzda get () const yglan edilmegine mümkinçilik berýär.

Esasy düşünje: Elmydama RAII gulp örtüklerini ( std :: shared_lock , std :: unique_lock ) std :: shared_mutex bilen ulanyň - hiç haçan lock () we gulpy () el bilen ulanmaň. Kadadan çykmalar bar bolsa el bilen gulplamak, möhletlere we kesgitlenmedik hereketlere kepillendirilen ýol.

std :: shared_mutex bilen işleýän wagtyňyz umumy ýalňyşlyklar näme?

Düşündirişler we gowy niýetler bilen hem std :: shared_mutex tejribeli işläp düzüjileri gyzyklandyrýan inçe duzaklar bar. Iň howplysy, gulpy täzelemek : umumy gulpy ilki goýbermezden aýratyn gulp bilen täzelemegiň içerki usuly ýok. Goýbermezden muny etmäge synanyşmak, birbada gulp saklaýar, sebäbi umumy gulp bar bolsa, şol bir wagtyň özünde saklap bolýan gulpy saklap bolýança hiç wagt berilmeýän aýratyn gulp garaşýarka, umumy gulp saklanýar.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

Anotherene bir umumy ýalňyşlyk, nädogry granulirligi goramakdyr. Döredijiler käwagt gaty giň gulplap, okyjy-ýazyjy nagşynyň maksadyny ýeňip geçýärler ýa-da iki sany aýratyn gulplama arasynda üýtgemeýänleriň penjirelerini goýýarlar. üýtgeýjiniň goralýandygyny düşündirýän teswirler, diňe üýtgeýjiniň gulplanmagy däl-de, toparlara kod gözden geçirilende dogrylygy barada pikirlenmäge kömek edýär.

Çykyş hem sizi geň galdyryp biler. Köp ýazyjylar bilen gaty jedelli ulgamlarda, std :: shared_mutex goşmaça buhgalter hasabynyň kömegi bilen adaty std :: mutex -dan has erbet ýerine ýetirip biler. Okyjy-ýazyjynyň gulpuny açmazdan ozal elmydama profil arassa ýeňişdir.

std :: shared_mutex std :: mutex we beýleki alternatiwalar bilen nädip deňeşdirilýär?

std :: mutex has ýönekeý, gapma-garşylyk pes bolanda has çalt we okamak we ýazmak takmynan deň ýygylykda ýüze çykýar. std :: shared_mutex ep-esli köp ýazylanda okaýar - 10: 1 ýa-da has ýokary gatnaşygy, wyklýuçateli göz öňünde tutmazdan ozal dogry düzgün.

C ++ 14 wagtlaýyn synanyşyklar üçin try_lock_shared_for () we try_lock_shared_until () goşýan std :: shared_timed_mutex hödürledi. C ++ 17-iň std :: shared_mutex has ýönekeý durmuşa geçirmek üçin bellenen wariantlary taşlaýar. Umumy ýolda wagtlaýyn gulplamak zerur bolsa, std :: shared_timed_mutex elýeterli bolup, iki görnüşi hem doly standart.

Gulpsyz alternatiwalar üçin, std :: atom seresaply ýat sargytlary bilen utgaşyp, käwagt ýönekeý baýdaklar ýa-da hasaplaýjylar üçin muteeksiň ornuny tutup biler, ýöne çylşyrymly maglumat gurluşlary üçin std :: shared_mutex adaty kitaphanada iň okalýan we dowam edip boljak çözgüt bolup galýar.

Freygy-ýygydan soralýan soraglar

std :: shared_mutex açlyga sebäp bolup bilermi?

Hawa, edip biler. Täze paýlaşylan gulp eýeleri yzygiderli gelmegini dowam etdirseler, aýratyn gulp talap ediji belli bir wagtlap garaşyp biler - nusgawy ýazyjynyň açlygy meselesi. C ++ standarty belli bir adalatlylyk syýasatyny talap etmeýär, şonuň üçin özüni alyp barşyň durmuşa geçirilmegine baglydyr. Iş ýüzünde, adaty kitaphanalaryň köpüsi nobata durandan soň garaşylýan aýratyn gulplary ileri tutýarlar, ýöne açlyk önümçilikde alada döredýän bolsa, muny ýörite gurallar zynjyry we platforma üçin barlamaly.

std :: shared_mutex std :: condition_variable bilen ulanmak ygtybarlymy?

std :: condition_variable std :: unique_lock talap edýär, şonuň üçin std :: shared_mutex bilen gönüden-göni gabat gelmeýär. Paýlaşylan muteeks saklaýan wagtyňyzda bir şerte garaşmaly bolsaňyz, std :: shared_mutex ýaly std :: shared_lock

ýaly islendik BasicLockable görnüşi bilen işleýän std :: condition_variable_any ulanyň.

Her gezek std :: shared_mutex ulananymda teswir goşmalymy?

Iň bolmanda, haýsy maglumatlary goraýandygyny we saklaýan üýtgewsizlerini düşündirmek üçin muteeksiň beýanyna düşündiriş beriň. Her gulp sahypasynda, eksklýuziw elýeterliligiň garşysyna näme üçin saýlanandygyny düşündirýän gysga teswir, kod synçylary we geljekki hyzmatçylary üçin möhüm ähmiýete eýe bolýar. Gabat gelmeýän näsazlyklar köpeltmek we düzetmek iň kyn zat, şonuň üçin anyk, takyk düşündirişlere goýlan maýa goýumlary birnäçe gezek dividend töleýär.


Çylşyrymly ulgamlary dolandyrmak - bir wagtyň özünde C ++ kody ýa-da tutuş bir iş amaly - dogry gurallary we anyk gurluşy talap edýär. Mewayz , 138,000-den gowrak ulanyjynyň marketing, CRM, elektron söwda, analitika we başga-da birmeňzeş aç-açanlygy üpjün etmek üçin 207 modully iş ulgamy, aýda bary-ýogy 19 dollardan başlaýar. Öçürilen onlarça gural bilen gürleşmegi bes ediň we oňat dizaýn edilen programma üpjünçiliginiň takyklygy bilen işiňizi dolandyryp başlaň. Şu gün app.mewayz.com -da Mewayz synap görüň we bitewi ulgamyň toparyňyzyň işleýşini üýtgedýändigini görüň.

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