Hacker News

C++17-tik Std:Shared_mutex ulertzea

Iruzkinak

7 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

C++17-tik std::shared_mutex ulertzea

std::shared_mutex, C++ 17-n sartuta, sinkronizazio primitibo bat da, hainbat hari aldi berean partekatutako (irakurtzeko) blokeoak edukitzea ahalbidetzen duena, idazketa-eragiketetarako sarbide esklusiboa bermatuz. C++ modernoko aldiberekotasun-erronka ohikoenetako bat konpontzen du, garatzaileei irakurle-idazleen blokeoa ezartzeko modu garbi eta estandarra emanez, hirugarrenen liburutegietara edo plataformako berariazko APIetara iritsi gabe.

Zer da zehazki std::shared_mutex eta zergatik gehitu zen C++17-n?

C++17 baino lehen, irakurle-idazle semantika behar zuten garatzaileek, pthread_rwlock_t bezalako plataforma espezifikoetan oinarritu behar zuten POSIX sistemetan edo SRWLOCK Windows-en, edo hirugarrenen liburutegiak erabiliko zituzten, hala nola Boost. C++17 estandar-batzordeak hutsune hori aitortu zuen eta std::shared_mutex sartu zuen goiburuan zuzenean zuzentzeko.

Oinarrizko ideia zuzena da: mundu errealeko programa askotan, datuak idatzi baino askoz maizago irakurtzen dira. std::mutex estandar batek sarbide guztiak serializatzen ditu —irakurketak barne— eta horrek alferrikako botila-lepoak sortzen ditu. std::shared_mutexk murrizketa hori kentzen du bi blokeo modu bereiziz:

  • Blokeo partekatua (irakurri)lock_shared() bidez eskuratua; hari anitzek aldi berean eduki dezakete, eta aldi berean irakurtzeko aproposa da.
  • Blokeo (idazketa) esklusiboalock() bidez eskuratua; Hari bakarrak eduki dezake aldi berean, eta ez da blokeo partekaturik onartzen eusten den bitartean.
  • std::shared_locklock_shared() eraikuntzan eta unlock_shared() suntsipenean deitzen duen RAII bilgarri bat, baliabideen ihesak saihesten dituena.
  • std::unique_lock / std::lock_guard — modu esklusiboarekin erabiltzen da, idazketa-eragiketak guztiz babestuta eta salbuespenetarako seguru daudela bermatuz.

Modu bikoitzeko diseinu honek std::shared_mutex egokitzapen naturala egiten du cacheak, konfigurazio-erregistroak eta irakurketak lan-kargan nagusi diren edozein datu-egitura bezalako agertokietarako.

Nola erabiltzen duzu std::shared_mutex benetako kodean iruzkinekin?

std::shared_mutex erabiltzen duen kodean iruzkinak bereziki baliotsuak dira, aldibereko logika oso zaila delako arrazoitzen. Ongi kokatutako iruzkinek argitzen dute zergatik blokeo mota jakin bat aukeratu den, eta horrek izugarri murrizten du etorkizuneko mantentzaileek datu-lasterketak ustekabean sartzeko arriskua. Hona hemen eredu tipiko bat:

#include 
#include 
#include 

ConfigRegistry klasea {
    mutable std::shared_mutex mtx_; // beheko mapa babesten du
    std::unordered_map data_;

publikoa:
    // Irakurri bidea: hainbat hari dei dezakete aldi berean
    std::string get(const std::string& tekla) const {
        std::shared_lock lock(mtx_); // blokeo partekatua — segurua irakurketa aldi berean egiteko
        auto it = data_.find(gakoa);
        itzuli!= data_.end() ? it->bigarren : "";
    }

    // Idatzi bidea: sarbide esklusiboa behar da
    void set (const std::string& tekla, const std::string& val) {
        std::unique_lock lock(mtx_); // blokeo esklusiboa — irakurle guztiak blokeatzen ditu
        datuak_[gakoa] = val;
    }
};

Ohartu iruzkinek blokeo-aukera bakoitzaren atzean dagoen asmoa nola azaltzen duten kodeak egiten duena berriro errepikatu beharrean. Hau da urrezko estandarra: iruzkinek zergatik erantzun behar dute, ez zer. Mutex-eko mutable gako-hitzak get() const deklaratzeko aukera ematen du, oraindik blokeatu ahal izateko, eredu arrunt eta idiomatiko bat.

Gakoen ikuspegia: Erabili beti RAII blokeo-bilketak (std::shared_lock, std::unique_lock) std::shared_mutex-rekin — inoiz ez deitu lock() eta desblokeatu() eskuz. Salbuespenen aurrean eskuz blokeatzea blokeoetarako eta definitu gabeko portaerarako bide bermatua da.

Zeintzuk dira std::shared_mutex-ekin lan egitean ohiko akatsak?

Nahiz eta iruzkin argiak eta asmo onak izan, std::shared_mutex-k garatzaile adituak ibiltzen dituzten tranpa sotilak ditu. Arriskutsuena blokeoen bertsio-berritzea da: ez dago partekatutako blokeoa blokeo esklusibo batera eguneratzeko modu integraturik lehen askatu gabe. Askatu gabe egiten saiatzeak berehalako blokeo-blokeoa sortzen du, hariak partekatutako blokeoa duelako, blokeo partekatua dagoen bitartean inoiz eman ezin den blokeo esklusiboaren zain dagoen bitartean, edukitzen duena barne.

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

Ohiko beste akats bat granularitate okerra babestea da. Garatzaileek, batzuetan, zabalegi blokeatzen dute, irakurle-idazle ereduaren helburua garaituz, edo estuegi, bi blokeo eskuraketen artean aldaezinak urratzen diren leihoak utziz. Babestu gabeko aldagaia deskribatzen duten iruzkinek, blokeatuta dagoen aldagaia baino, taldeei zuzentasunari buruz arrazoitzen laguntzen diete kodea berrikustean.

Errendimenduak ere harritu zaitu. Idazle asko dituzten sistema oso lehiatuetan, std::shared_mutex benetan std::mutex arrunt batek baino okerragoa izan daiteke, kontabilitatearen gainkostua dela eta. Egin beti profila irakurle-idazleen blokeoa irabazi garbia dela suposatu aurretik.

Nola alderatzen da std::shared_mutex std::mutex eta beste alternatiba batzuekin?

std::mutex sinpleagoa da, azkarragoa da eskuratzen gatazka baxua denean, eta egokia irakurketak eta idazketak gutxi gorabehera maiztasun berdinean gertatzen direnean. std::shared_mutex distira egiten du irakurketak idazketa kopurua nabarmen gainditzen duenean — 10:1 edo handiagoa proportzioa arrazoizko arau bat da aldaketa kontuan hartu aurretik.

C++14-k std::shared_timed_mutex sartu zuen, eta horrek try_lock_shared_for() eta try_lock_shared_until() gehitzen ditu denborazko saiakeretarako. C++17-ren std::shared_mutex denborazko aldaerak kentzen ditu inplementazio arinago baterako. Bide partekatuan denboraz blokeatzea behar baduzu, std::shared_timed_mutex erabilgarri egongo da eta bi motak guztiz estandarrak dira.

Blokerik gabeko alternatibetarako, std::atomic memoria ordenamendu zainduarekin konbinatuta, batzuetan, mutex bat guztiz ordezkatu dezake bandera edo kontagailu soiletarako, baina datu-egitura konplexuetarako, std::shared_mutex liburutegi estandarreko soluziorik irakurgarriena eta mantentzen dena izaten jarraitzen du.

Ohiko galderak

Std::shared_mutex-ek gosea eragin al dezake?

Bai, daiteke. Partekatutako blokeoen titular berriak etengabe iristen badira, blokeo esklusiboaren eskatzaile batek mugarik gabe itxaron dezake; idazle gosea arazo klasikoa da. C++ estandarrak ez du zuzentasun politika zehatzik agintzen, beraz, portaera inplementazioaren araberakoa da. Praktikan, liburutegiaren inplementazio estandar gehienek zain dauden blokeo esklusiboak lehenesten dituzte ilaran jarritakoan, baina hori egiaztatu beharko zenuke zure tresna-kate eta plataforma espezifikorako, gosea ekoizpenean kezkatzen bada.

Std::shared_mutex segurua da std::condition_variable-rekin erabiltzeko?

std::condition_variable std::unique_lock behar du, beraz, ez da zuzenean bateragarria std::shared_mutex-rekin. Partekatutako mutex bat eduki bitartean baldintzaren bat itxaron behar baduzu, erabili std::condition_variable_any, BasicLockable edozein motarekin funtzionatzen duena, std::shared_mutex barne, std::shared_lock batekin parekatuta.

Iruzkinak gehitu behar al ditut std::shared_mutex erabiltzen dudan bakoitzean?

Gutxienez, iruzkin ezazu mutexaren deklarazioa zer datu babesten dituen eta mantentzen dituen aldaezinak deskribatzeko. Blokeo gune bakoitzean, sarbide partekatua eta esklusiboa zergatik aukeratu den azaltzen duen iruzkin labur batek balio handia ematen die kode berrikusleei eta etorkizuneko zaintzaileei. Aldibereko akatsak erreproduzitzen eta konpontzen zailenetakoak dira, beraz, iruzkin argi eta zehatzetan egindako inbertsioak dibidenduak ematen ditu askotan.


Sistema konplexuak kudeatzeko, C++ kodea aldi berean edo negozio-eragiketa oso bat izan, tresna egokiak eta egitura argia eskatzen du. Mewayz 138.000 erabiltzaile baino gehiagok fidatzen duten 207 moduluko negozio-sistema eragilea da, marketinari, CRMri, merkataritza elektronikoari, analitikari eta abarrei argitasun bera emateko, dena plataforma bakarrean hilean 19 dolar baino lehen. Utzi deskonektatutako dozenaka tresnarekin malabareari eta hasi zure negozioa ondo diseinatutako softwarearen zehaztasunarekin zuzentzen. Probatu Mewayz gaur app.mewayz.com helbidean eta ikusi nola eraldatzen duen sistema bateratu batek zure taldearen lan egiteko modua.

.

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