Hacker News

Std:Shared_mutex nteaseɛ a ɛfiri C++17

Nsɛm a wɔka

11 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Std::shared_mutex nteaseɛ a ɛfiri C++17

std::shared_mutex, a wɔde aba C++17 mu no yɛ synchronization primitive a ɛma threads pii tumi kura shared (read) locks bere koro mu bere a ɛhwɛ ma wonya kwan soronko ma akyerɛw dwumadi ahorow. Ɛdi concurrency nsɛnnennen a ɛtaa ba wɔ nnɛyi C++ mu no mu baako ho dwuma denam ɔkwan a ɛho tew, a ɛyɛ gyinapɛn a ɛma developers a wɔfa so de akenkanfoɔ-ɔkyerɛwfoɔ locking di dwuma a wɔrenkɔ nwomakorabea a ɛtɔ so mmiɛnsa anaa platform-specific APIs.

Dɛn Pɛpɛɛpɛ ne std::shared_mutex ne Dɛn Nti na Wɔde Kaa Ho Wɔ C++17 mu?

Ansa na C++17 reba no, na ɛsɛ sɛ developers a wohia akenkanfoɔ-ɔkyerɛwfoɔ semantics de wɔn ho to platform-specific solutions te sɛ pthread_rwlock_t wɔ POSIX systems anaa SRWLOCK wɔ Windows so, anyɛ saa a wɔde third-party libraries te sɛ Boost bedi dwuma. C++17 gyinapɛn boayikuo no hunuu saa nsonsonoeɛ yi na wɔde std::shared_mutex baa ti no mu de dii ho dwuma tẽẽ.

Adwene titiriw no yɛ tẽẽ: wɔ wiase ankasa nhyehyɛe pii mu no, wɔkenkan data mpɛn pii sen sɛnea wɔkyerɛw. Gyinapɛn std::mutex serializes access nyinaa — akenkan ka ho — a ɛde bottlenecks a ɛho nhia ba. std::shared_mutex ma saa anohyeto no so denam nsonsonoe a ɛda akwan abien a wɔfa so to mu ntam:

  • Wɔakyekyɛ (kenkan) lock — wɔanya denam lock_shared() so; nhama pii betumi akura eyi bere koro mu, na ɛma ɛyɛ nea eye ma akenkan a ɛkɔ so bere koro mu.
  • Ɛyɛ (kyerɛw) lock — wɔnya denam lock() so; asaawa biako pɛ na ebetumi akura eyi bere koro mu, na wɔmma kwan mma wɔmfa nkɔnsɔnkɔnsɔn a wɔkyɛ bere a wɔakura mu no.
  • std::shared_lock — RAII wrapper a ɛfrɛ lock_shared() wɔ adansi mu ne unlock_shared() wɔ ɔsɛeɛ mu, siw nneɛma a ɛretu.
  • std::unique_lock / std::lock_guard — wɔde di dwuma ne mode a ɛyɛ soronko no, hwɛ sɛ wɔabɔ akyerɛw dwumadie ho ban koraa na ɛyɛ exception-safe.

Saa dual-mode nhyehyeɛ yi ma std::shared_mutex yɛ abɔdeɛ a ɛfata ma nsɛm te sɛ caches, nhyehyeɛ registries, ne data nhyehyeɛ biara a akenkan di adwuma no so.

Wobɛyɛ dɛn de std::shared_mutex Di Dwuma wɔ Real Code a Nsɛm Wɔka Mu?

Nsɛm a wɔka wɔ koodu a ɛde std::shared_mutex di dwuma no som bo titiriw efisɛ concurrency logic agye dimmɔne sɛ ɛyɛ den sɛ wobesusuw ho. Nsɛm a wɔde asi hɔ yiye no ma nea enti wɔpaw lock type pɔtee bi mu da hɔ, a ɛtew asiane a ɛwɔ hɔ sɛ daakye ahwɛfo de data mmirikatu ahorow bɛba wɔ akwanhyia mu no so kɛse. Nhwɛsoɔ a wɔtaa yɛ nie:

#fa  ka ho
#fa  ka ho
#fa  ka ho

adesuakuw ConfigRegistry { .
    std a ɛsakra::wɔkyɛ_mutex mtx_; // bɔ map a ɛwɔ aseɛ ha no ho ban
    std::map_a wɔanhyehyɛ no  data_;

ɔmanfoɔ:
    // Kenkan kwan: nhama pii betumi afrɛ eyi bere koro mu
    std::ahama nya (const std::ahama& safoa) const {
        std::wɔkyɛ_apon ano (mtx_); // shared lock — ahobammɔ ma akenkan a ɛkɔ so bere koro mu
        auto no = data_.hwehwɛ (safoa);
        san kɔ no != data_.end () ? it->nea ɛto so abien : "";
    } .

    // Twerɛ kwan: exclusive access a wɔhwehwɛ
    void set (const std:: ahama & safoa, const std:: ahama & val) {
        std:: soronko_lock lock (mtx_); // exclusive lock — siw akenkanfo nyinaa kwan
        data_ [safoa] = val;
    } .
};
na ɛyɛ adwuma

Hwɛ sɛnea nsɛm no kyerɛkyerɛ adwene a ɛwɔ lock paw biara akyi sen sɛ wobɛsan aka nea koodu no yɛ kɛkɛ. Eyi ne sika kɔkɔɔ gyinapɛn: ɛsɛ sɛ nsɛm a wɔka no bua dɛn ntia, na ɛnyɛ dɛn. mutable asɛmfua titiriw a ɛwɔ mutex no so no ma kwan ma wɔpae mu ka get()const bere a ɛda so ara tumi to mu, nhwɛso a wɔtaa yɛ na ɛyɛ kasakoa.

a wɔde ahyɛ mu

Key Insight: Fa RAII lock wrappers (std::shared_lock, std::unique_lock) di dwuma bere nyinaa ne std::shared_mutex — mfrɛ lock() ne unlock() da. Nsaano a wɔde to mu wɔ baabi a nneɛma a wɔayi afi mu wɔ hɔ no yɛ ɔkwan a wɔahyɛ ho bɔ sɛ ɛkɔ deadlocks ne suban a wɔankyerɛkyerɛ mu.

na ɛkyerɛ sɛ woayɛ

Afiri bɛn na ɛtaa ba bere a wo ne std::shared_mutex reyɛ adwuma?

Sɛ wowɔ nsɛm a emu da hɔ na adwempa mpo a, std::shared_mutex wɔ afiri a ɛnyɛ anifere a ɛbɔ nnwumayɛfo a wɔn ho akokwaw. Nea ɛyɛ hu sen biara ne lock upgrade: ɔkwan biara nni hɔ a wɔasisi a wobɛfa so ama lock a wɔakyekyɛ no akɔ lock a ɛyɛ soronko a wonnyi no adi kan. Sɛ wobɔ mmɔden sɛ wobɛyɛ saa a worennyae a, ɛde ɔhaw ba ntɛm ara efisɛ asaawa no kura lock a wɔakyekyɛ bere a ɛretwɛn lock a ɛyɛ soronko a wontumi mma da bere tenten a lock biara a wɔakyɛ wɔ hɔ — a nea ɛkura no ka ho.

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

Mfomso foforo a wɔtaa di ne sɛ wɔbɛbɔ granularity a ɛnteɛ no ho ban. Ɛtɔ da bi a, developers lock trɛw dodo, di atirimpɔw a ɛwɔ akenkanfo-ɔkyerɛwfo nhwɛso no so nkonim, anaasɛ teateaa dodo, gyaw windows a wɔabu invariants so wɔ lock acquisitions abien a ɛsono emu biara ntam. Nsɛm a ɛkyerɛkyerɛ invariant a wɔrebɔ ho ban, sen sɛ wɔbɛto variable no mu kɛkɛ no boa akuw ma wosusuw nea ɛteɛ ho bere a wɔrehwɛ mmara no mu.

Adwumayɛ nso betumi ama wo ho adwiriw wo. Wɔ nhyehyɛe ahorow a wɔpere wɔn ho kɛse a akyerɛwfo pii wom so no, std::shared_mutex betumi ayɛ adwuma bɔne ankasa asen std::mutex a ɛnyɛ den esiane nhomakorabea ho ka foforo nti. Bere nyinaa profile ansa na woafa no sɛ akenkanfo-ɔkyerɛwfo locking yɛ net nkonimdi.

Ɛbɛyɛ dɛn na std::shared_mutex Toto std::mutex ne Nneɛma Afoforo a Wɔde Si Ase Ho?

std::mutex yɛ mmerɛw, ɛyɛ ntɛm sɛ wobenya bere a akyinnyegye sua, na ɛfata bere a akenkan ne akyerɛw kɔ so wɔ mpɛn dodow a ɛbɛyɛ pɛ mu. std::shared_mutex hyerɛn bere a akenkan dodow boro akyerɛw so kɛse — 10:1 anaa nea ɛboro saa ratio yɛ mmara a ntease wom ansa na woasusuw nsakrae no ho.

C++14 de std::shared_timed_mutex bae, a ɛde try_lock_shared_for() ne try_lock_shared_until() ka ho ma mmɔdenbɔ a wɔde bere ahyɛ mu. C++17 std::shared_mutex no tow bere mu nsakrae ahorow no gu ma ɛyɛ leaner implementation. Sɛ wo hia bere a wɔde toto mu wɔ ɔkwan a wɔakyekyɛ no so a, std::shared_timed_mutex da so ara wɔ hɔ na ahorow abien no nyinaa yɛ gyinapɛn a edi mũ.

Wɔ akwan foforo a lock-free ho no, std::atomic a wɔde ahwɛyiye a wɔde hyehyɛ memory no aka ho no, ɛtɔ mmere bi a ebetumi asi mutex ananmu koraa ama frankaa anaa akontaabu a ɛnyɛ den, nanso wɔ data nhyehyɛe a ɛyɛ den ho no, std::shared_mutex da so ara yɛ ano aduru a wotumi kenkan na wotumi hwɛ so sen biara wɔ nhomakorabea a ɛwɔ gyinapɛn no mu.

Nsɛmmisa a Wɔtaa Bisa

So std::shared_mutex betumi ama ɔkɔm aba?

Yiw, ebetumi aba. Sɛ shared-lock holders foforo kɔ so ba bere nyinaa a, exclusive-lock requester bi betumi atwɛn daa — ɔkyerɛwfo ɔkɔm haw a ɛyɛ tete de. C++ gyinapɛn no nhyɛ sɛ wɔnyɛ nhyehyɛe pɔtee bi a ɛfa atɛntrenee ho, enti suban gyina sɛnea wɔde bedi dwuma no so. Wɔ nnwuma mu no, nwomakorabea dwumadie dodoɔ no ara a wɔde di dwuma a ɛyɛ gyinapɛn no de apontoɔ soronko a wɔretwɛn no di kan bere a wɔatoto ntonto no, nanso ɛsɛ sɛ wohwɛ yei mu ma wo adwinnadeɛ ne platform pɔtee no sɛ ɔkɔm yɛ ade a ɛhaw adwene wɔ adwumayɛ mu a.

So std::shared_mutex yɛ ahobammɔ sɛ wode bedi dwuma ne std::condition_variable?

std::condition_variable hwehwɛ std::unique_lock, enti ɛne std::shared_mutex nhyia tẽẽ. Sɛ ɛho hia sɛ wotwɛn wɔ tebea bi mu bere a wokura mutex a wɔakyekyɛ mu a, fa std::condition_variable_any di dwuma, a ɛne BasicLockable su biara yɛ adwuma, a std::shared_mutex a wɔde abɔ mu ne std::shared_lock.

ka ho

So ɛsɛ sɛ mede nsɛm ka ho bere biara a mede std::shared_mutex bedi dwuma?

Anyɛ yiye koraa no, ka mutex no mpaemuka no ho asɛm de kyerɛkyerɛ data a ɛbɔ ho ban ne invariants a ɛhwɛ so. Wɔ lock site biara so no, nsɛm tiawa bi a ɛkyerɛkyerɛ nea enti a wɔpaw kyɛfa a wɔde ma ne nea wɔde ma nkutoo no de mfaso kɛse ka ho ma wɔn a wɔhwɛ mmara no mu ne wɔn a wɔbɛhwɛ so daakye. Concurrency bugs ka nea ɛyɛ den sɛ wɔbɛsan ayɛ na wɔasiesie no ho, enti sika a wɔde hyɛ nsɛm a emu da hɔ na ɛyɛ pɛpɛɛpɛ mu no tua mfaso mpɛn pii.


Nhyehyɛe a ɛyɛ den a wɔbɛhwɛ so — sɛ́ ɛyɛ C++ koodu a ɛkɔ so bere koro mu anaasɛ adwumayɛ dwumadi nyinaa — hwehwɛ sɛ wonya nnwinnade a ɛfata ne nhyehyɛe a emu da hɔ. Mewayz yɛ 207-module adwumayɛ OS a nnipa bɛboro 138,000 gye di sɛ ɛde saa pefeeyɛ koro no ara bɛba aguadi, CRM, e-commerce, nhwehwɛmu, ne nea ɛkeka ho, ne nyinaa wɔ platform biako so a efi ase fi $19 pɛ ɔsram biara. Gyae sɛ wode nnwinnade du du pii a wɔatwa mu no di dwuma na fi ase fa softwea a wɔayɛ no yiye di w’adwuma no pɛpɛɛpɛ. Sɔ Mewayz hwɛ nnɛ wɔ app.mewayz.com na hwɛ sɛnea nhyehyɛe a wɔaka abom sesa ɔkwan a wo kuw no fa so yɛ adwuma.

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