Hacker News

Std verstoen: Shared_mutex aus C ++ 17

Kommentaren

8 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Std::shared_mutex vun C++17 verstoen

std::shared_mutex, a C++17 agefouert, ass e Synchroniséierungsprimitiv, deen e puer Threads erlaabt gläichzäiteg gedeelt (liesen) Spären ze halen, wärend exklusiv Zougang fir Schreifoperatioune garantéiert. Et léist eng vun den heefegsten concurrency Erausfuerderungen am modernen C++ andeems d'Entwéckler e propperen, Standard Wee ginn fir d'Lieser-Schrëftsteller Sperrung ëmzesetzen ouni Drëtt-Partei-Bibliothéiken oder plattformspezifesch APIen z'erreechen.

Wat ass genee std::shared_mutex a firwat gouf et am C++17 bäigefüügt?

Virun C++17, hunn Entwéckler, déi Lieser-Schrëftsteller Semantik gebraucht hunn, op plattformspezifesch Léisunge wéi pthread_rwlock_t op POSIX Systemer oder SRWLOCK op Windows vertrauen, oder se benotze Drëtt-Parteibibliothéike wéi Boost. De C++17 Standardcomité huet dës Lück erkannt an huet std::shared_mutex am Header agefouert fir se direkt unzegoen.

D'Käridee ass einfach: a ville Real-Welt Programmer ginn Daten vill méi dacks gelies wéi se geschriwwe sinn. E Standard std::mutex serialiséiert all Zougang - liest abegraff - wat onnéideg Flaschenhals erstellt. std::shared_mutex hëlt dës Restriktioun op andeems se tëscht zwee Sperrmodi ënnerscheeden:

  • Gedeelt (liesen) Spär — iwwer lock_shared() erfaasst; Multiple Threads kënnen dëst gläichzäiteg halen, wat et ideal mécht fir gläichzäiteg Liesungen.
  • Exklusiv (Schreif) Spär — iwwer lock() kritt; nëmmen ee Fuedem kann dëst gläichzäiteg halen, a keng gemeinsame Spären sinn erlaabt während se ofgehale gëtt.
  • std::shared_lock — e RAII-Wrapper deen lock_shared() op Konstruktioun rifft an unlock_shared() op Zerstéierung, verhënnert Ressourcelecks.
  • std::unique_lock / std::lock_guard — benotzt mam exklusive Modus, fir datt d'Schreifoperatioune komplett geschützt an ausnahmssécher sinn.

Dësen Dual-Modus Design mécht std::shared_mutex eng natierlech Passung fir Szenarie wéi Cache, Konfiguratiounsregistratiounen, an all Datenstruktur wou d'Lies d'Aarbechtslaascht dominéieren.

Wéi benotzt Dir std::shared_mutex am Real Code mat Kommentaren?

Kommentaren am Code deen std::shared_mutex benotzt si besonnesch wäertvoll, well d'Concurrency Logik notoresch schwéier ass ze raisonnéieren. Gutt plazéiert Kommentaren klären firwat e bestëmmte Sperrtyp gewielt gouf, wat de Risiko vun zukünfteg Ënnerhalter drastesch reduzéiert datt zukünfteg Ënnerhalter zoufälleg Datenrennen aféieren. Hei ass en typescht Muster:

#include 
#include 
#include 

class ConfigRegistry {
    mutable std :: shared_mutex mtx_; // schützt d'Kaart hei drënner
    std::unordered_map data_;

ëffentlech:
    // Liesen Wee: Multiple Threads kënnen dëst gläichzäiteg nennen
    std::string get(const std::string& key) const {
        std :: shared_lock lock(mtx_); // gedeelt Sperrung - sécher fir gläichzäiteg Liesungen
        auto et = data_.find (Schlëssel);
        zréckginn != data_.end() ? it->second : "";
    }

    // Schreifweis: exklusiv Zougang néideg
    void set (const std::string& key, const std::string& val) {
        std::unique_lock lock(mtx_); // exklusiv Spär - blockéiert all Lieser
        data_[Schlëssel] = val;
    }
};

Bemierkung wéi d'Kommentaren d'Intent hannert all Spärwahl erklären anstatt just ze widderhuelen wat de Code mécht. Dëst ass de Goldstandard: Kommentare sollen firwat beäntweren, net wat. De mutable Schlësselwuert op der mutex erlaabt get() const deklaréiert ze ginn, während se nach ëmmer fäeg sinn ze spären, e gemeinsamt an idiomatescht Muster.

Schlësselinsiicht: Benotzt ëmmer RAII-Spärwrapper (std::shared_lock, std::unique_lock) mat std::shared_mutex - ruff ni lock() an unlock() manuell op. Manuell Sperrung an der Presenz vun Ausnahmen ass e garantéierte Wee zu Deadlocks an ondefinéiert Verhalen.

Wat sinn déi gemeinsam Fallen wann Dir mat std::shared_mutex schafft?

Och mat kloere Kommentaren a gudde Virsätz huet std::shared_mutex subtile Fallen, déi erfuerene Entwéckler ausléisen. Déi geféierlechst assSpär Upgrade: et gëtt keen agebaute Wee fir e gemeinsame Spär op en exklusive Sperr ze upgrade ouni et als éischt ze befreien. Versicht dat ze maachen ouni ze léisen schaaft en direkten Deadlock well de Fuedem e gemeinsame Sperrung hält wärend op den exklusive Sperrung waart, deen ni zougestëmmt ka ginn soulaang wéi eng gemeinsam Sperrung existéiert - och deen deen et hält.

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

En anere gemeinsame Feeler ass déi falsch Granularitéit ze schützen. D'Entwéckler spären heiansdo ze breet, besiegen den Zweck vum Lieser-Schrëftsteller Muster, oder ze schmuel, verloosse Fënstere wou Invarianten tëscht zwee getrennten Spär Acquisitioune verletzt ginn. Kommentaren déi den invariant geschützt sinn beschreiwen, anstatt just d'Variabel déi gespaart ass, hëllefen d'Equipen iwwer d'Korrektheet während der Codeiwwerpréiwung ze redenéieren.

Performance kann Iech och iwwerraschen. Op héichbestriddene Systemer mat ville Schrëftsteller kann std::shared_mutex tatsächlech méi schlëmm Leeschtunge wéi en einfachen std::mutex wéinst der zousätzlecher Bookkeeping Overhead. Ëmmer Profil virun unhuelen Lieser-Schrëftsteller Spär ass en Nettogewënn.

Wéi vergläicht std::shared_mutex mat std::mutex an aner Alternativen?

std::mutex ass méi einfach, méi séier ze kréien wann d'Sträit niddereg ass, a passend wann d'Liesen a Schreiwen op ongeféier gläich Frequenz geschéien. std::shared_mutex blénkt wann d'Liesen däitlech méi wéi d'Schreifweis liesen - en 10:1 oder méi héich Verhältnis ass eng raisonnabel Fauschtregel ier Dir de Schalter berücksichtegt.

C++14 huet std::shared_timed_mutex agefouert, déi try_lock_shared_for() an try_lock_shared_until() fir Zäitversuch bäidréit. C++17's std::shared_mutex fällt déi Zäitvarianten fir eng méi schlank Ëmsetzung erof. Wann Dir Zäit Sperrung um gemeinsame Wee braucht, bleift std::shared_timed_mutex verfügbar a béid Aarte si voll Standard.

Fir gespaarten-gratis Alternativen, std::atomic kombinéiert mat virsiichteg Erënnerungsbestellung kann heiansdo e Mutex ganz fir einfach Fändelen oder Konter ersetzen, awer fir komplex Datestrukturen bleift std::shared_mutex déi liesbarst an erhale Léisung an der Standardbibliothéik.

Heefeg gestallte Froen

Kann std::shared_mutex Honger verursaachen?

Jo, et kann. Wann nei Shared-Lock-halter kontinuéierlech ukommen, kann en exklusive Spär-Ufroer onbestëmmt waarden - e klassesche Schrëftstellerhonger-Problem. De C ++ Standard mandat net eng spezifesch Fairness Politik, sou datt Verhalen hänkt vun der Ëmsetzung of. An der Praxis prioritär déi meescht Standardbibliothéikimplementatiounen erwaardende exklusiv Spären eemol se an der Schlaang sinn, awer Dir sollt dëst fir Är spezifesch Toolchain a Plattform verifizéieren wann Honger eng Suerg an der Produktioun ass.

Ass std::shared_mutex sécher ze benotzen mat std::condition_variable?

std::condition_variable erfuerdert en std::unique_lock, also ass et net direkt kompatibel mat std::shared_mutex. Wann Dir musst op eng Konditioun waarden wann Dir e gemeinsame Mutex hält, benotzt std::condition_variable_any, déi mat all BasicLockable Typ funktionnéiert, dorënner std::shared_mutex gepaart mat engem std::shared_lock.

Soll ech Kommentarer all Kéier wann ech std::shared_mutex benotzen?

Op d'mannst kommentéiert d'Deklaratioun vum Mutex fir ze beschreiwen wat fir Daten et schützt an d'Invarianten déi se ënnerhalen. Op all Spär Site, e kuerze Kommentar erkläert firwat gedeelt versus exklusiv Zougang gewielt gouf bäidréit bedeitende Wäert fir Code Rezensiounen an zukünfteg Ënnerhalter. Concurrency Bugs gehéieren zu den haardsten ze reproduzéieren an ze fixéieren, sou datt d'Investitioun a kloer, präzis Kommentarer vill Mol Dividenden bezilt.


Gestioun vun komplexe Systemer - egal ob gläichzäiteg C++ Code oder eng ganz Geschäftsoperatioun - erfuerdert déi richteg Tools a kloer Struktur. Mewayz ass den 207-Modul Business OS vertraut vun iwwer 138,000 Benotzer fir déi selwecht Kloerheet fir Marketing, CRM, E-Commerce, Analyse, a méi ze bréngen, alles an enger Plattform ab just $ 19 pro Mount. Stop op Dosende vun disconnected Tools jongléieren an ufänken Äre Betrib mat der Präzisioun vun gutt-entworf Software ze bedreiwen. Probéiert Mewayz haut op app.mewayz.com a kuckt wéi en vereenegt System de Wee vun Ärem Team funktionnéiert transforméiert.