Hacker News

Pagsabot sa Std:Shared_mutex gikan sa C++17

Mga komento

9 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Pagsabot sa std::shared_mutex gikan sa C++17

std::shared_mutex, nga gipaila sa C++17, maoy usa ka synchronization primitive nga nagtugot sa daghang mga thread nga dungan nga maggunit sa shared (read) nga mga kandado samtang nagsiguro sa eksklusibong pag-access para sa mga operasyon sa pagsulat. Gisulbad niini ang usa sa labing komon nga mga hagit sa concurrency sa modernong C++ pinaagi sa paghatag sa mga developer og limpyo, standard nga paagi sa pagpatuman sa reader-writer locking nga dili makaabot sa mga third-party nga library o mga platform-specific nga API.

Unsa ang Eksaktong std::shared_mutex ug Nganong Gidugang Kini sa C++17?

Sa wala pa ang C++17, ang mga developers nga nanginahanglan ug reader-writer semantics kinahanglang mosalig sa mga solusyon nga espesipiko sa plataporma sama sa pthread_rwlock_t sa POSIX system o SRWLOCK sa Windows, o mogamit sila og mga third-party nga librarya sama sa Boost. Ang C++17 standard committee miila niini nga kal-ang ug mipaila sa std::shared_mutex sa header aron direkta kining matubag.

Ang kinauyokan nga ideya prangka: sa daghang tinuod nga kalibutan nga mga programa, ang datos gibasa nga mas kanunay kay sa gisulat. Usa ka sumbanan nga std::mutex nag-serialize sa tanan nga pag-access — gilakip ang mga pagbasa — nga nagmugna sa dili kinahanglan nga mga bottleneck. Ang std::shared_mutex nagtangtang niana nga pagdili pinaagi sa pag-ila tali sa duha ka locking mode:

  • Gipaambit (basaha) nga lock — nakuha pinaagi sa lock_shared(); daghang mga hilo ang makakupot niini nga dungan, nga naghimo niini nga maayo alang sa dungan nga mga pagbasa.
  • Eksklusibo (isulat) lock — nakuha pinaagi sa lock(); usa lang ka hilo ang mahimong magkupot niini sa usa ka higayon, ug walay gitugutan nga mga kandado samtang kini gihuptan.
  • std::shared_lock — usa ka RAII wrapper nga nagtawag sa lock_shared() sa pagtukod ug unlock_shared() sa pagkaguba, nga nagpugong sa resource leaks.
  • std::unique_lock / std::lock_guard — gigamit sa eksklusibong mode, pagsiguro nga ang mga operasyon sa pagsulat hingpit nga gipanalipdan ug luwas sa gawas.

Kining dual-mode nga disenyo naghimo sa std::shared_mutex nga usa ka natural nga angay alang sa mga senaryo sama sa mga cache, configuration registries, ug bisan unsa nga istruktura sa datos diin ang mga basahon maoy modominar sa workload.

Giunsa Nimo Paggamit ang std::shared_mutex sa Tinuod nga Kodigo nga May mga Komento?

Ang mga komentaryo sa code nga naggamit sa std::shared_mutex ilabinang bililhon tungod kay ang concurrency logic kay lisod kaayong pangatarungan. Ang maayong pagkabutang nga mga komentaryo nagpatin-aw sa nganousa ka partikular nga tipo sa kandado ang gipili, nga makapamenos pag-ayo sa risgo sa umaabot nga mga tigmintinar nga aksidenteng nagpaila sa mga lumba sa datos. Ania ang kasagarang sumbanan:

#include 
#include 
#ilakip ang 

class ConfigRegistry {
    mutable std::shared_mutex mtx_; // nanalipod sa mapa sa ubos
    std::unordered_map data_;

publiko:
    // Basaha ang dalan: daghang mga hilo mahimong magtawag niini nga dungan
    std::string get(const std::string& key) const {
        std::shared_lock lock(mtx_); // shared lock — luwas para sa dungan nga pagbasa
        auto kini = data_.find(key);
        ibalik kini != data_.end() ? kini->ikaduha : "";
    }

    // Isulat ang dalan: ekslusibong pag-access ang gikinahanglan
    void set(const std::string& key, const std::string& val) {
        std:: unique_lock lock(mtx_); // eksklusibo nga kandado — gibabagan ang tanan nga mga magbabasa
        data_[key] = val;
    }
};

Matikdi kung giunsa pagpatin-aw sa mga komentaryo ang katuyoan sa luyo sa matag kapilian sa lock kaysa isulti lang kung unsa ang gibuhat sa code. Kini ang bulawan nga sumbanan: ang mga komentaryo kinahanglan nga motubag ngano, dili unsa. Ang mutable nga keyword sa mutex nagtugot sa get() nga madeklarar nga const samtang maka-lock pa, usa ka komon ug idiomatic nga pattern.

Key Insight: Kanunay gamita ang RAII lock wrapper (std::shared_lock, std::unique_lock) gamit ang std::shared_mutex — ayawg tawga ang lock() ug unlock() nga mano-mano. Ang manwal nga pag-lock sa presensya sa mga eksepsiyon usa ka garantisadong dalan paingon sa mga deadlock ug dili matino nga kinaiya.

Unsa ang Kasagaran nga mga Salo-salo Sa Pagtrabaho Uban sa std::shared_mutex?

Bisan sa tin-aw nga mga komentaryo ug maayong katuyoan, ang std::shared_mutex adunay maliputon nga mga lit-ag nga makapasuko sa mga eksperyensiyadong developer. Ang labing delikado mao angpag-upgrade sa lock: walay built-in nga paagi sa pag-upgrade sa usa ka shared lock ngadto sa usa ka exclusive lock nga dili kini buhian una. Ang pagsulay sa pagbuhat sa ingon nga dili buhian nagmugna og usa ka dayon nga deadlock tungod kay ang hilo nagkupot sa usa ka gipaambit nga kandado samtang naghulat sa eksklusibo nga kandado nga dili gyud mahatag basta adunay bisan unsang gipaambit nga kandado — apil ang gikuptan niini.

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

Laing kasagarang sayop mao ang pagpanalipod sa sayop nga granularity. Usahay ang mga developers nag-lock sa lapad kaayo, nagpildi sa katuyoan sa pattern sa magbabasa-magsusulat, o hiktin kaayo, nagbilin sa mga bintana diin ang mga invariant nalapas tali sa duha ka managlahing lock acquisition. Ang mga komento nga naghulagway sa invariant nga giprotektahan, imbes nga ang variable lang ang gi-lock, makatabang sa mga team nga mangatarungan mahitungod sa pagkahusto atol sa pagrepaso sa code.

Ang pasundayag makapatingala usab kanimo. Sa mga sistema nga daghan kaayong mga magsusulat, ang std::shared_mutex mahimong mas grabe pa kay sa yanong std::mutex tungod sa dugang nga overhead sa bookkeeping. Kanunay nga mag-profile sa dili pa maghunahuna nga ang pag-lock sa magbabasa-magsusulat usa ka net nga kadaugan.

Giunsa ang std::shared_mutex Itandi sa std::mutex ug Uban pang Alternatibo?

std::mutex mas simple, mas paspas nga makuha kung gamay ang panagbingkil, ug angay kung ang pagbasa ug pagsulat mahitabo sa halos parehas nga frequency. std::shared_mutex modan-ag kon ang mga basahon mas daghan kay sa nasulat — ang 10:1 o mas taas nga ratio maoy usa ka makatarunganong lagda sa dili pa ikonsiderar ang switch.

C++14 nagpaila std::shared_timed_mutex, nga nagdugang try_lock_shared_for() ug try_lock_shared_until() para sa gitakdang panahon nga pagsulay. Ang std::shared_mutex sa C++17 naghulog sa gitakda nga mga variant para sa mas hinay nga pagpatuman. Kung kinahanglan nimo ang oras nga pag-lock sa gipaambit nga agianan, ang std::shared_timed_mutex nagpabilin nga magamit ug ang duha nga mga tipo hingpit nga sukaranan.

Para sa lock-free nga mga alternatibo, std::atomic inubanan sa mabinantayon nga pag-order sa memorya usahay makapuli sa usa ka mutex sa hingpit alang sa yano nga mga flag o counter, apan alang sa komplikadong mga istruktura sa datos, ang std::shared_mutex nagpabilin nga labing mabasa ug mamentinar nga solusyon sa standard library.

Mga Pangutana nga Kanunayng Gipangutana

Ang std::shared_mutex ba mahimong hinungdan sa kagutom?

Oo, mahimo. Kon ang bag-ong shared-lock holder padayon nga moabot, ang usa ka exclusive-lock requester mahimong maghulat hangtod sa hangtod — usa ka classic writer starvationproblema. Ang sumbanan sa C ++ wala magmando sa usa ka piho nga palisiya sa patas, busa ang pamatasan nagdepende sa pagpatuman. Sa praktis, kadaghanan sa mga standard nga implementasyon sa librarya nag-una sa pending nga eksklusibong mga kandado sa higayon nga mapila na kini, apan kinahanglan nimo kining pamatud-an para sa imong espesipikong toolchain ug plataporma kung ang kagutom usa ka kabalaka sa produksiyon.

Ang std::shared_mutex ba luwas gamiton sa std::condition_variable?

std::condition_variable nanginahanglan og std::unique_lock, busa dili kini direkta nga compatible sa std::shared_mutex. Kung kinahanglan ka maghulat sa usa ka kondisyon samtang naggunit ug gipaambit nga mutex, gamita ang std::condition_variable_any, nga magamit sa bisan unsang klase nga BasicLockable, lakip ang std::shared_mutex nga gipares sa usa ka std::shared_lock.

Dugang ba nako ang mga komentaryo matag higayon nga mogamit ko sa std::shared_mutex?

Sa labing gamay, ikomento ang deklarasyon sa mutex aron ihulagway kung unsa nga datos ang giprotektahan niini ug ang mga invariant nga gipadayon niini. Sa matag lock site, usa ka mubo nga komentaryo nga nagpatin-aw ngano nga gipili ang gipili nga gibahin batok sa eksklusibo nga pag-access nagdugang hinungdanon nga kantidad alang sa mga tigsusi sa code ug mga tigmintinar sa umaabot. Ang mga bug sa concurrency usa sa mga pinakalisud nga kopyahon ug ayohon, mao nga ang pagpamuhunan sa tin-aw, tukma nga mga komento nagbayad sa mga dibidendo sa daghang mga higayon.


Pagdumala sa mga komplikadong sistema — dungan man nga C++ code o tibuok nga operasyon sa negosyo — nanginahanglan sa hustong himan ug tin-aw nga istruktura. Mewayzmao ang 207-module nga OS sa negosyo nga gisaligan sa kapin sa 138,000 ka tiggamit nga magdala sa samang katin-aw sa marketing, CRM, e-commerce, analytics, ug uban pa, tanan sa usa ka plataporma sugod sa $19 lang kada bulan. Hunonga ang pag-juggling sa daghang mga nadiskonekta nga mga himan ug pagsugod sa pagpadagan sa imong negosyo nga adunay katukma sa maayong pagkadisenyo nga software. Sulayi ang Mewayz karon sa app.mewayz.com ug tan-awa kung giunsa pagbag-o sa hiniusang sistema ang paagi sa pagtrabaho sa imong team.