Hacker News

Skilningur á Std:Shared_mutex frá C++17

Athugasemdir

9 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Skilningur á std::shared_mutex frá C++17

std::shared_mutex, kynnt í C++17, er frumsamstilling sem gerir mörgum þráðum kleift að halda samtímis sameiginlegum (lesa) læsingum á sama tíma og það tryggir einkaaðgang fyrir skrifaðgerðir. Það leysir eina af algengustu samhliðaáskorunum í nútíma C++ með því að veita þróunaraðilum hreina, staðlaða leið til að innleiða læsingar- og ritaralæsingu án þess að ná til þriðja aðila bókasöfnum eða vettvangssértækum API.

Hvað er std::shared_mutex nákvæmlega og hvers vegna var því bætt við í C++17?

Fyrir C++17 þurftu verktaki sem þurftu merkingarfræði lesenda og ritara að treysta á vettvangssértækar lausnir eins og pthread_rwlock_t á POSIX kerfum eða SRWLOCK á Windows, annars myndu þeir nota þriðja aðila bókasöfn eins og Boost. C++17 staðlanefndin viðurkenndi þetta bil og kynnti std::shared_mutex í hausnum til að taka á því beint.

Kjarnihugmyndin er einföld: í mörgum raunverulegum forritum eru gögn lesin mun oftar en þau eru skrifuð. Staðlað std::mutex serializes allan aðgang - lestur innifalinn - sem skapar óþarfa flöskuhálsa. std::shared_mutex afléttir þeirri takmörkun með því að greina á milli tveggja læsingarhama:

  • Deilt (lesið) læsing — aflað með lock_shared(); margir þræðir geta haldið þessu samtímis, sem gerir það tilvalið fyrir samhliða lestur.
  • Einstakur (skrif) læsing — keyptur með lock(); aðeins einn þráður má halda þessu í einu, og engir samnýttir læsingar eru leyfðar á meðan honum er haldið.
  • std::shared_lock — RAII umbúðir sem kallar á lock_shared() við byggingu og unlock_shared() við eyðingu, sem kemur í veg fyrir leka úr auðlindum.
  • std::unique_lock / std::lock_guard — notað með einkastillingunni, sem tryggir að skrifaðgerðir séu að fullu verndaðar og undantekningaröruggar.

Þessi tvöfalda hönnun gerir std::shared_mutex að eðlilegri hæfni fyrir aðstæður eins og skyndiminni, stillingarskrár og hvers kyns gagnaskipulag þar sem lestur ræður mestu um vinnuálagið.

Hvernig notar þú std::shared_mutex í raunkóða með athugasemdum?

Athugasemdir í kóða sem notar std::shared_mutex eru sérstaklega verðmætar vegna þess að samhliða rökfræði er alræmt erfitt að rökræða um. Vel settar athugasemdir skýra af hverju tiltekin lástegund var valin, sem dregur verulega úr hættunni á því að framtíðarviðhaldarar kynni óvart gagnahlaup. Hér er dæmigert mynstur:

#include 
#include <óraðað_kort>
#include 

class ConfigRegistry {
    breytanlegur std::shared_mutex mtx_; // verndar kortið hér að neðan
    std::óraðað_kort gögn_;

opinbert:
    // Lesslóð: margir þræðir geta kallað þetta samtímis
    std::string get(const std::string& lykill) const {
        std::shared_lock lock(mtx_); // sameiginlegur læsingur — öruggur fyrir samhliða lestur
        auto it = data_.find(lykill);
        skila því != data_.end() ? it->second : "";
    }

    // Skrifslóð: Einkaaðgangur krafist
    ógilt sett (const std::string& lykill, const std::string& val) {
        std :: einstakur_lás læsing (mtx_); // einkalás — lokar á alla lesendur
        data_[lykill] = val;
    }
};

Taktu eftir því hvernig athugasemdirnar útskýra tilganginn á bak við hvert læsingarval frekar en að endurtaka það sem kóðinn gerir. Þetta er gulls ígildi: athugasemdir ættu að svara af hverju, ekki hvað. breytanlegt lykilorðið á mutex leyfir að get() sé lýst yfir const á meðan það er enn hægt að læsa, algengt og orðrænt mynstur.

Lykilinnsýn: Notaðu alltaf RAII læsa umbúðir (std::shared_lock, std::unique_lock) með std::shared_mutex — hringdu aldrei í lock() og unlock() handvirkt. Handvirk læsing þar sem undantekningar eru til staðar er tryggð leið til stöðvunar og óskilgreindrar hegðunar.

Hverjar eru algengustu gildrurnar þegar unnið er með std::shared_mutex?

Jafnvel með skýrar athugasemdir og góðan ásetning hefur std::shared_mutex lúmskar gildrur sem snerta reyndan forritara. Hættulegasta er lásuppfærsla: það er engin innbyggð leið til að uppfæra sameiginlegan lás í einkalás án þess að losa hann fyrst. Tilraun til að gera það án þess að sleppa skapar tafarlausa biðlás vegna þess að þráðurinn heldur á sameiginlegum lás á meðan hann bíður eftir einkalásnum sem aldrei er hægt að veita svo lengi sem einhver sameiginlegur lás er til – þar með talið sá sem hann heldur.

💡 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 →

Önnur algeng mistök eru að vernda ranga greiningu. Hönnuðir læsa stundum of vítt, vinna gegn tilgangi lesenda-ritaramynstrsins, eða of þröngt og skilja eftir glugga þar sem óbreytileikar eru brotnir á milli tveggja aðskildra læsinga. Athugasemdir sem lýsa óbreytileikanum sem er varinn, frekar en að breytunni sé læst, hjálpa teymum að rökræða um réttmæti við yfirferð kóðans.

Frammistaða getur líka komið þér á óvart. Í mjög umsóttum kerfum með mörgum rithöfundum gæti std::shared_mutex í raun gengið verr en venjulegt std::mutex vegna viðbótarbókhaldskostnaðar. Vertu alltaf með prófíl áður en þú gerir ráð fyrir að læsing lesenda og ritara sé hreinn sigur.

Hvernig ber std::shared_mutex saman við std::mutex og aðra valkosti?

std::mutex er einfaldara, fljótlegra að afla sér þegar ágreiningur er lítill og viðeigandi þegar lestur og skrif eiga sér stað á nokkurn veginn jafnri tíðni. std::shared_mutex lýsir þegar lestur er verulega meiri en skrifar - 10:1 eða hærra hlutfall er eðlileg þumalputtaregla áður en skipt er um það.

C++14 kynnti std::shared_timed_mutex, sem bætir við try_lock_shared_for() og try_lock_shared_until() fyrir tímasettar tilraunir. C++17's std::shared_mutex sleppir tímasettum afbrigðum fyrir grennri útfærslu. Ef þú þarft tímasetta læsingu á samnýttu slóðinni, er std::shared_timed_mutex áfram í boði og báðar gerðir eru að fullu staðlaðar.

Fyrir láslausa valkosti getur std::atomic ásamt nákvæmri minnisröðun stundum komið í stað mutex algjörlega fyrir einfalda fána eða teljara, en fyrir flókna gagnabyggingu er std::shared_mutex áfram læsilegasta og viðhaldshæfasta lausnin í venjulegu bókasafni.

Algengar spurningar

Getur std::shared_mutex valdið hungri?

Já, það getur það. Ef nýir handhafar samnýttra læsinga halda áfram að koma stöðugt, gæti einkalásabeiðandi beðið endalaust - klassískt rithöfundarsvelti vandamál. C++ staðallinn kveður ekki á um sérstaka sanngirnisstefnu, þannig að hegðun fer eftir útfærslunni. Í reynd forgangsraða flestar stöðluðu bókasafnsútfærslur í bið eftir einkalásum þegar þeir eru komnir í biðröð, en þú ættir að staðfesta þetta fyrir tiltekna verkfærakeðju þína og vettvang ef svelti er áhyggjuefni í framleiðslu.

Er std::shared_mutex öruggt í notkun með std::condition_variable?

std::condition_variable krefst std::unique_lock, svo það er ekki beint samhæft við std::shared_mutex. Ef þú þarft að bíða eftir ástandi á meðan þú heldur á sameiginlegu mutex, notaðu std::condition_variable_any, sem virkar með hvaða BasicLockable gerð sem er, þar á meðal std::shared_mutex parað við std::shared_lock.

Ætti ég að bæta við athugasemdum í hvert skipti sem ég nota std::shared_mutex?

Að minnsta kosti, skrifaðu athugasemdir við yfirlýsingu mutex til að lýsa hvaða gögnum það verndar og óbreytileikanum sem það heldur. Á hverri lássíðu bætir stutt athugasemd sem útskýrir hvers vegna sameiginlegur aðgangur en einkaaðgangur var valinn umtalsverðu gildi fyrir umsagnaraðila kóða og framtíðarviðhaldara. Samhliða villur eru með þeim erfiðustu að endurskapa og laga, þannig að fjárfestingin í skýrum, nákvæmum athugasemdum skilar sér margfalt til baka.


Að hafa umsjón með flóknum kerfum – hvort sem það er samtímis C++ kóða eða heilan viðskiptarekstur – krefst réttra verkfæra og skýrrar uppbyggingu. Mewayz er 207 eininga viðskiptastýrikerfið sem yfir 138.000 notendur treysta til að koma með sömu skýrleika í markaðssetningu, CRM, rafræn viðskipti, greiningar og fleira, allt á einum vettvangi frá aðeins $19 á mánuði. Hættu að leika tugum ótengdra verkfæra og byrjaðu að reka fyrirtæki þitt með nákvæmni vel hannaðs hugbúnaðar. Prófaðu Mewayz í dag á app.mewayz.com og sjáðu hvernig sameinað kerfi umbreytir því hvernig teymið þitt vinnur.