Hacker News

Ɔndastandin Std:Shared_mutex frɔm C++17

Kɔmɛnt dɛn

11 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Ɔndastand std::shared_mutex frɔm C++17

std::shared_mutex, we dɛn introduks insay C++17, na sinkronizashɔn primitiv we de alaw bɔku trɛd dɛn fɔ ol shered (rid) lɔk dɛn wan tɛm we dɛn de mek shɔ se dɛn gɛt ɛksklusiv akses fɔ rayt ɔpreshɔn. I de sɔlv wan pan di mɔs kɔmɔn kɔnkɔrɛns chalenj dɛn na di mɔdan C++ bay we i de gi divɛlɔpa dɛn wan klin, standad we fɔ impruv rida-rayta lɔk we dɛn nɔ rich fɔ tɔd-pati laybri ɔ pletfɔm-spɛsifi k API dɛn.

Wetin Eksaktli Na std::shared_mutex ɛn Wetin Mek Dɛn Ad am na C++17?

Bifo C++17, divɛlɔpa dɛn we bin nid rida-rayta sɛmantiks bin gɛt fɔ abop pan pletfɔm-spɛsifi k sɔlvishɔn dɛn lɛk pthread_rwlock_t pan POSIX sistem ɔ SRWLOCK pan Windows, ɔ dɛn go yuz tɔd-pati laybri dɛn lɛk Boost. Di C++17 standad kɔmiti bin no dis gap ɛn dɛn introduks std::shared_mutex na di hεda fɔ adrɛs am dairekt.

Di men aidia na stret: insay bɔku rial-wɔl program dɛm, dɛn kin rid data fa fawe pas aw dɛn rayt am. Wan standad std::mutex de serialize ɔl di akses — rid inklud — we de mek botlɛn we nɔ nid. std::shared_mutex de lif da ristrikshɔn de bay we i difrɛns bitwin tu lɔk mɔd dɛn:

    we dɛn kɔl
  • Shɛri (rid) lɔk — dɛn gɛt am bay lɔk_shɛri(); bɔku trɛd dɛn kin ol dis wan tɛm, we de mek i fayn fɔ rid wan tɛm.
  • Eksklusiv (rayt) lɔk — we dɛn gɛt bay lɔk(); na wan trɛd nɔmɔ kin ol dis wan tɛm, ɛn dɛn nɔ alaw fɔ sheb lɔk we dɛn de ol am.
  • std::shared_lock — na RAII wrap we de kɔl lock_shared() pan kɔnstrɔkshɔn ɛn unlock_shared() pan distrɔkshɔn, we de mek risɔs nɔ lik.
  • std::unique_lock / std::lock_guard — dɛn yuz am wit di ɛksklusiv mɔd, fɔ mek shɔ se rayt ɔpreshɔn dɛn ful-ɔp fɔ protɛkt ɛn ɛksɛpshɔn-sef.

Dis dual-mode dizayn de mek std::shared_mutex na natura fit fɔ sɛnɛriɔ lɛk kesh, kɔnfigyushɔn rɛjista, ɛn ɛni data strɔkchɔ usay rid de domin di woklɔd.

Aw Yu De Yuz std::shared_mutex na Rial Kɔd Wit Kɔmɛnt?

Kɔmɛnt dɛn na kɔd we de yuz std::shared_mutex na patikyula valyu bikɔs kɔnkɔrɛns lɔjik na notoriously at fɔ rizin bɔt. Kɔmɛnt dɛn we dɛn put fayn fayn wan de mek wi no klia wan wetin mek dɛn pik wan patikyula kayn lɔk, we de ridyus di risk fɔ mek di wan dɛn we de mentenɛns tumara bambay aksidɛntli introduks data rɛs. Na dis na wan tipik patɛn:

#inklud 
#inklud 
#inklud  we yu de yuz

klas KɔnfigRɛjista { .
    mutabl std::shɛri_myutɛks mtx_; // de protɛkt di map we de dɔŋ ya
    std::nɔ-ɔda_map data_;

pɔblik:
    // Rid pat: bɔku trɛd dɛn kin kɔl dis wan tɛm
    std::string get(kɔnst std::string& ki) kɔnst {
        std::shɛri_lɔk lɔk (mtx_); // shared lock — sef fɔ rid wan tɛm
        auto it = data_.fayn (ki);
        ritɔn am != data_.ɛnd () ? it->sɛkɔn : "";
    } .

    // Rayt pat: ɛksklusiv akses nid
    void set(konst std::string& ki, konst std::string& val) {
        std:: yunik_lɔk lɔk (mtx_); // exclusive lock — de blok ɔl di wan dɛn we de rid
        data_[ki] = val;
    } .
};

Notis aw di kɔmɛnt dɛn de ɛksplen di tin we dɛn want fɔ du biɛn ɛni lɔk we dɛn pik pas fɔ jɔs tɔk bak bɔt wetin di kɔd de du. Dis na di gold standad: kɔmɛnt fɔ ansa wetin mek, nɔto wetin. Di mutable ki wɔd na di mutex de alaw fɔ deklare get() fɔ deklare const we i stil ebul fɔ lɔk, we na kɔmɔn ɛn idiomatik patɛn.

Ki Insayt: Yuz RAII lɔk wrapa ɔltɛm (std::shared_lock, std::unique_lock) wit std::shared_mutex — nɔ ɛva kɔl lock() ɛn unlock() wit yu an. Manual lɔk insay di prɛzɛns fɔ ɛksɛpshɔn na garanti rod fɔ dɛdlɔk ɛn undefined bihayvya.

we yu kin yuz

Wetin Na di Kɔmɔn Trap dɛn we Yu De Wok wit std::shared_mutex?

Ivin wit klia kɔmɛnt ɛn gud intenshɔn, std::shared_mutex gɛt subtil trap dɛn we de trip ɔp ɛkspiriɛns divɛlɔpa dɛn. Di wan we denja pas ɔl na lɔk ɔpgrɛd: no we nɔ de fɔ ɔpgrɛd wan shered lɔk to wan spɛshal lɔk we yu nɔ rilis am fɔs. If yu tray fɔ du dat we yu nɔ rilis, i de mek wan dɛdlɔk wantɛm wantɛm bikɔs di trɛd de ol wan shered lɔk we i de wet fɔ di ɛksklusiv lɔk we dɛn nɔ go ɛva gi as lɔng as ɛni shered lɔk de — inklud di wan we i de ol.

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

Wan ɔda kɔmɔn mistek na fɔ protɛkt di rɔng granularity. Divεlכpεr dεm sכmtεm dεn kin lכk tu brayt, dεfεt di prכpכz fכ di rida-rayta patεn, כ tu sכm, lεf winda dεm usay invεriεnt dεm de violet bitwin tu difrεnt lכk akwyushכn dεm. Kɔmɛnt dɛn we de diskrayb di invariant we dɛn de protɛkt, pas fɔ jɔs di vɛriɔbul we dɛn de lɔk, de ɛp tim dɛn fɔ tink bɔt kɔrɛkt we dɛn de rivyu di kɔd.

Pɔfɔmɛnshɔn kin sɔprayz yu bak. Na sistɛm dɛn we gɛt bɔku kɔntenshɔn wit bɔku rayta dɛn, std::shared_mutex kin rili pefɔm wɔs pas wan plein std::mutex bikɔs ɔf di ɔda bukkipin ɔvahɛd. Ɔltɛm profayl bifo yu tek am se rida-rayta lɔk na nɛt win.

Aw std::shared_mutex Kɔmpia to std::mutex ɛn Ɔda Ɔda Tin dɛn?

std::mutex na simpul wan, i fast fɔ gɛt we kɔntinyuɛns nɔ bɔku, ɛn i fayn we rid ɛn rayt de apin na lɛk ikwal frikshɔn. std::shared_mutex de shayn we rid signifyant ɔtnɔmba rayt — 10:1 ɔ ay ratio na rizin lɔ fɔ thumb bifo yu tink bɔt di swich.

C++14 introdyus std::shared_timed_mutex, we ad try_lock_shared_for() ɛn try_lock_shared_until() fɔ tray we dɛn dɔn tɛm. C++17 in std::shared_mutex de drɔp di tɛmd vayriɔnt fɔ wan slim implimɛnt. If yu nid fɔ lɔk we dɛn dɔn tɛm na di pat we dɛn sheb, std::shared_timed_mutex de stil de ɛn ɔl tu di kayn dɛn na ful standad.

Fɔ ɔltɛrnativ dɛn we nɔ gɛt lɔk, std::atomic we dɛn jɔyn wit tek tɛm ɔda mɛmori, sɔntɛnde kin riples wan mutex ɔl fɔ simpul flag ɔ kɔnta, bɔt fɔ kɔmpleks data strɔkchɔ, std::shared_mutex kin stil bi di sɔlv we pɔsin kin rid ɛn mentenɛt pas ɔl na di standad laybri.

Kwɛshɔn dɛn we dɛn kin aks bɔku tɛm

Std::shared_mutex kin mek angri?

Yes, i kin bi. If nyu shered-lɔk ɔlda dɛn kɔntinyu fɔ kam kɔntinyu, wan ɛksklusiv-lɔk rikwest kin wet fɔ lɔng tɛm — wan klas rayta angri prɔblɛm. Di C++ standad nɔ de mandat wan patikyula fayn polisi, so bihayvya dipen pan di implimɛnt. Insay prɔsis, mɔs standad laybri implimɛnt dɛn de prayoritɛt pendin ɛksklusiv lɔk dɛn wans dɛn dɔn kiyu, bɔt yu fɔ chɛk dis fɔ yu spɛshal tulchɛn ɛn pletfɔm if angri na sɔntin we de mɔna yu na prodakshɔn.

I sef fɔ yuz wit std::shared_mutex?

std::condition_variable nid fɔ gɛt std::unique_lock, so i nɔ kɔmpitabl dairekt wit std::shared_mutex. If yu nid fɔ wet pan kɔndishɔn we yu de ol wan shered mutex, yuz std::condition_variable_any, we de wok wit ɛni BasicLockable tayp, inklud std::shared_mutex we dɛn pe wit wan std::shared_lock.

A fɔ ad kɔmɛnt ɛvri tɛm we a de yuz std::shared_mutex?

At minimum, kɔmɛnt di diklareshɔn fɔ di mutex fɔ diskrayb us data i de protɛkt ɛn di invariant dɛn we i de mentɛn. Na ɛni lɔk sayt, wan shɔt kɔmɛnt we de ɛksplen wetin mek dɛn pik shered versus exklusiv akses de ad impɔtant valyu fɔ di wan dɛn we de rivyu di kɔd ɛn di wan dɛn we go mentenɛt di kɔd tumara bambay. Kɔnkɔrɛns bɔg dɛn de pan di wan dɛn we at fɔ mek dɛn riprodyuz ɛn fiks, so di invɛstismɛnt fɔ klia, prɛsis kɔmɛnt dɛn de pe divɛdɛnt bɔku tɛm pas.


we de na di wɔl

Fɔ manej kɔmpleks sistɛm dɛn — ilɛksɛf na kɔnkɔrɛnt C++ kɔd ɔ wan ɔl biznɛs ɔpreshɔn — nid fɔ gɛt di rayt tul ɛn klia strɔkchɔ. Mewayz na di 207-modul biznɛs OS we pas 138,000 yuza dɛn trɔst fɔ briŋ da sem klia wan de to makɛt, CRM, i-kɔmrɛs, analitiks, ɛn mɔ, ɔl dis na wan pletfɔm we de stat frɔm jɔs $19 fɔ wan mɔnt. Stɔp fɔ jɔg bɔku bɔku tul dɛn we nɔ gɛt kɔnekshɔn ɛn bigin fɔ rul yu biznɛs wit di prɛsishɔn we sɔftwɛl we dɛn dɔn mek fayn fayn wan gɛt. Tray Mewayz tide na app.mewayz.com ɛn si aw wan yunifayd sistɛm de chenj di we aw yu tim de wok.

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