Hacker News

C++17 నుండి Std:Shared_mutex అర్థం చేసుకోవడం

వ్యాఖ్యలు

2 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

C++17 నుండి std::shared_mutex అర్థం చేసుకోవడం

std::shared_mutex, C++17లో పరిచయం చేయబడింది, ఇది వ్రాత కార్యకలాపాలకు ప్రత్యేక ప్రాప్యతను నిర్ధారించేటప్పుడు బహుళ థ్రెడ్‌లను ఏకకాలంలో భాగస్వామ్య (రీడ్) లాక్‌లను పట్టుకోవడానికి అనుమతించే సమకాలీకరణ ఆదిమ. ఇది థర్డ్-పార్టీ లైబ్రరీలు లేదా ప్లాట్‌ఫారమ్-నిర్దిష్ట APIలను చేరుకోకుండా రీడర్-రైటర్ లాకింగ్‌ని అమలు చేయడానికి డెవలపర్‌లకు క్లీన్, స్టాండర్డ్ మార్గాన్ని అందించడం ద్వారా ఆధునిక C++లో అత్యంత సాధారణ కాన్కరెన్సీ సవాళ్లలో ఒకదాన్ని పరిష్కరిస్తుంది.

std::shared_mutex అంటే ఏమిటి మరియు ఇది C++17లో ఎందుకు జోడించబడింది?

C++17కి ముందు, రీడర్-రైటర్ సెమాంటిక్స్ అవసరమయ్యే డెవలపర్‌లు POSIX సిస్టమ్‌లలో pthread_rwlock_t లేదా Windowsలో SRWLOCK వంటి ప్లాట్‌ఫారమ్-నిర్దిష్ట పరిష్కారాలపై ఆధారపడవలసి ఉంటుంది లేదా వారు బూస్ట్ వంటి థర్డ్-పార్టీ లైబ్రరీలను ఉపయోగిస్తారు. C++17 స్టాండర్డ్ కమిటీ ఈ గ్యాప్‌ని గుర్తించి, నేరుగా పరిష్కరించడానికి std::shared_mutexని హెడర్‌లో ప్రవేశపెట్టింది.

ప్రధాన ఆలోచన సూటిగా ఉంటుంది: అనేక వాస్తవ-ప్రపంచ ప్రోగ్రామ్‌లలో, డేటా వ్రాసిన దానికంటే చాలా తరచుగా చదవబడుతుంది. ఒక ప్రామాణిక std::mutex అన్ని యాక్సెస్‌లను సీరియల్ చేస్తుంది — రీడ్‌లు చేర్చబడ్డాయి — ఇది అనవసరమైన అడ్డంకులను సృష్టిస్తుంది. std::shared_mutex రెండు లాకింగ్ మోడ్‌ల మధ్య తేడాను గుర్తించడం ద్వారా ఆ పరిమితిని ఎత్తివేస్తుంది:

  • భాగస్వామ్య (చదవబడిన) లాక్lock_shared() ద్వారా పొందబడింది; బహుళ థ్రెడ్‌లు దీన్ని ఏకకాలంలో పట్టుకోగలవు, ఇది ఏకకాలిక రీడ్‌లకు అనువైనదిగా చేస్తుంది.
  • ప్రత్యేకమైన (వ్రాయండి) లాక్lock() ద్వారా పొందబడింది; ఒకేసారి ఒక థ్రెడ్ మాత్రమే దీన్ని కలిగి ఉండవచ్చు మరియు ఇది పట్టుకున్నప్పుడు భాగస్వామ్య లాక్‌లు అనుమతించబడవు.
  • std::shared_lock — RAII ర్యాపర్ నిర్మాణంపై lock_shared() మరియు విధ్వంసంపై unlock_shared(), వనరుల లీక్‌లను నివారిస్తుంది.
  • std::unique_lock / std::lock_guard — ప్రత్యేక మోడ్‌తో ఉపయోగించబడుతుంది, వ్రాత కార్యకలాపాలు పూర్తిగా రక్షింపబడినవి మరియు మినహాయింపు-సురక్షితమైనవని నిర్ధారిస్తుంది.

ఈ డ్యూయల్-మోడ్ డిజైన్ std::shared_mutex కాష్‌లు, కాన్ఫిగరేషన్ రిజిస్ట్రీలు మరియు రీడ్‌లు వర్క్‌లోడ్‌ని డామినేట్ చేసే ఏదైనా డేటా స్ట్రక్చర్ వంటి దృశ్యాలకు సహజంగా సరిపోతాయి.

కామెంట్‌లతో రియల్ కోడ్‌లో మీరు std::shared_mutexని ఎలా ఉపయోగిస్తున్నారు?

std::shared_mutexని ఉపయోగించే కోడ్‌లోని వ్యాఖ్యలు చాలా విలువైనవి ఎందుకంటే కాన్కరెన్సీ లాజిక్ గురించి తర్కించడం చాలా కష్టం. ఒక నిర్దిష్ట లాక్ రకాన్ని ఎందుకు ఎంచుకున్నారో చక్కగా ఉంచబడిన వ్యాఖ్యలు స్పష్టం చేస్తాయి, ఇది భవిష్యత్ నిర్వహణదారులు అనుకోకుండా డేటా రేసులను ప్రవేశపెట్టే ప్రమాదాన్ని నాటకీయంగా తగ్గిస్తుంది. ఇక్కడ ఒక సాధారణ నమూనా ఉంది:

#include 
#<క్రమం చేయని_మ్యాప్> చేర్చండి
# చేర్చండి

తరగతి కాన్ఫిగరిజిస్ట్రీ {
    మార్చగల std::shared_mutex mtx_; // దిగువ మ్యాప్‌ను రక్షిస్తుంది
    std::unordered_map data_;

పబ్లిక్:
    // రీడ్ పాత్: బహుళ థ్రెడ్‌లు దీనిని ఏకకాలంలో కాల్ చేయవచ్చు
    std::string get(const std::string& key) const {
        std::shared_lock లాక్(mtx_); // షేర్డ్ లాక్ — ఏకకాల రీడ్‌ల కోసం సురక్షితం
        ఆటో ఇట్ = డేటా_.ఫైండ్(కీ);
        దాన్ని తిరిగి ఇవ్వండి != data_.end() ? అది->రెండవది : "";
    }

    // రైట్ పాత్: ప్రత్యేకమైన యాక్సెస్ అవసరం
    శూన్య సెట్ (const std::string& key, const std::string&val) {
        std::unique_lock లాక్(mtx_); // ప్రత్యేకమైన లాక్ — పాఠకులందరినీ బ్లాక్ చేస్తుంది
        డేటా_[కీ] = విలువ;
    }
};

కోడ్ ఏమి చేస్తుందో మళ్లీ చెప్పడం కంటే ప్రతి లాక్ ఎంపిక వెనుక ఉన్న ఉద్దేశాన్ని వ్యాఖ్యలు ఎలా వివరిస్తున్నాయో గమనించండి. ఇది బంగారు ప్రమాణం: వ్యాఖ్యలు ఎందుకు సమాధానం ఇవ్వాలి, ఏమి కాదు. మ్యూటెక్స్‌లోని మ్యూటబుల్ కీవర్డ్ get()ని లాక్ చేయగలిగేటప్పుడు constని ప్రకటించడానికి అనుమతిస్తుంది, ఇది సాధారణ మరియు ఇడియోమాటిక్ నమూనా.

కీ అంతర్దృష్టి: std::shared_mutexతో ఎల్లప్పుడూ RAII లాక్ రేపర్‌లను (std::shared_lock, std::unique_lock) ఉపయోగించండి — lock()కి కాల్ చేయవద్దు మరియు lock()కి కాల్ చేయవద్దు. మినహాయింపుల సమక్షంలో మాన్యువల్ లాకింగ్ అనేది డెడ్‌లాక్‌లు మరియు నిర్వచించబడని ప్రవర్తనకు హామీ ఇవ్వబడిన మార్గం.

std::shared_mutexతో పని చేస్తున్నప్పుడు సాధారణ ఆపదలు ఏమిటి?

స్పష్టమైన వ్యాఖ్యలు మరియు మంచి ఉద్దేశ్యాలతో కూడా, std::shared_mutex అనుభవజ్ఞులైన డెవలపర్‌లను కదిలించే సూక్ష్మ ఉచ్చులను కలిగి ఉంది. అత్యంత ప్రమాదకరమైనది లాక్ అప్‌గ్రేడ్: షేర్ చేసిన లాక్‌ని ముందుగా విడుదల చేయకుండా ప్రత్యేకమైన లాక్‌కి అప్‌గ్రేడ్ చేయడానికి అంతర్నిర్మిత మార్గం లేదు. విడుదల చేయకుండా అలా చేయడానికి ప్రయత్నించడం తక్షణ ప్రతిష్టంభనను సృష్టిస్తుంది ఎందుకంటే థ్రెడ్ భాగస్వామ్య లాక్‌ని కలిగి ఉంటుంది, ఎందుకంటే ఏదైనా భాగస్వామ్య లాక్ ఉనికిలో ఉన్నంత వరకు - అది కలిగి ఉన్న దానితో సహా ఎప్పటికీ మంజూరు చేయబడదు.

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

మరో సాధారణ తప్పు తప్పు గ్రాన్యులారిటీని రక్షించడం. డెవలపర్‌లు కొన్నిసార్లు చాలా విస్తృతంగా లాక్ చేస్తారు, రీడర్-రైటర్ నమూనా యొక్క ప్రయోజనాన్ని ఓడించారు లేదా చాలా తృటిలో, రెండు వేర్వేరు లాక్ సముపార్జనల మధ్య మార్పులేని వాటిని ఉల్లంఘించిన విండోలను వదిలివేస్తారు. కేవలం వేరియబుల్ లాక్ చేయబడి ఉండటమే కాకుండా అస్థిరమైన రక్షణని వివరించే వ్యాఖ్యలు, కోడ్ రివ్యూ సమయంలో సరియైన దాని గురించి తెలుసుకోవడానికి బృందాలకు సహాయపడతాయి.

పనితీరు కూడా మిమ్మల్ని ఆశ్చర్యపరుస్తుంది. చాలా మంది రచయితలతో అత్యంత వివాదాస్పద సిస్టమ్‌లలో, అదనపు బుక్‌కీపింగ్ ఓవర్‌హెడ్ కారణంగా std::shared_mutex వాస్తవానికి సాధారణ std::mutex కంటే అధ్వాన్నంగా పని చేస్తుంది. రీడర్-రైటర్ లాకింగ్ నికర విజయంగా భావించే ముందు ఎల్లప్పుడూ ప్రొఫైల్ చేయండి.

std::shared_mutex std::mutex మరియు ఇతర ప్రత్యామ్నాయాలతో ఎలా పోలుస్తుంది?

std::mutex అనేది సరళమైనది, వివాదాలు తక్కువగా ఉన్నప్పుడు వేగంగా పొందడం మరియు చదవడం మరియు వ్రాయడం దాదాపు సమాన పౌనఃపున్యం వద్ద జరిగినప్పుడు తగినది. std::shared_mutex వ్రాతలను గణనీయంగా మించిపోయినప్పుడు మెరుస్తుంది — స్విచ్‌ను పరిగణనలోకి తీసుకునే ముందు 10:1 లేదా అంతకంటే ఎక్కువ నిష్పత్తి సహేతుకమైన సూత్రం.

C++14 std::shared_timed_mutexని ప్రవేశపెట్టింది, ఇది సమయం ముగిసిన ప్రయత్నాల కోసం try_lock_shared_for() మరియు try_lock_shared_until()ని జోడిస్తుంది. C++17 యొక్క std::shared_mutex సన్నగా అమలు చేయడం కోసం సమయం ముగిసిన వేరియంట్‌లను తగ్గిస్తుంది. మీరు భాగస్వామ్య మార్గంలో సమయానుకూలంగా లాక్ చేయవలసి వస్తే, std::shared_timed_mutex అందుబాటులో ఉంటుంది మరియు రెండు రకాలు పూర్తిగా ప్రామాణికమైనవి.

లాక్-ఫ్రీ ప్రత్యామ్నాయాల కోసం, std::atomic జాగ్రత్తగా మెమరీ ఆర్డరింగ్‌తో కలిపి సాధారణ ఫ్లాగ్‌లు లేదా కౌంటర్‌ల కోసం కొన్నిసార్లు మ్యూటెక్స్‌ని పూర్తిగా భర్తీ చేయవచ్చు, కానీ సంక్లిష్ట డేటా స్ట్రక్చర్‌ల కోసం, ప్రామాణిక లైబ్రరీలో std::shared_mutex అత్యంత చదవగలిగే మరియు నిర్వహించదగిన పరిష్కారంగా మిగిలిపోయింది.

తరచుగా అడిగే ప్రశ్నలు

std::shared_mutex ఆకలిని కలిగిస్తుందా?

అవును, అది చేయవచ్చు. కొత్త భాగస్వామ్య-లాక్ హోల్డర్‌లు నిరంతరం వస్తుంటే, ప్రత్యేకమైన లాక్ అభ్యర్థి నిరవధికంగా వేచి ఉండవచ్చు - క్లాసిక్ రైటర్ ఆకలి సమస్య. C++ ప్రమాణం నిర్దిష్ట న్యాయమైన విధానాన్ని తప్పనిసరి చేయదు, కాబట్టి ప్రవర్తన అమలుపై ఆధారపడి ఉంటుంది. ఆచరణలో, చాలా స్టాండర్డ్ లైబ్రరీ ఇంప్లిమెంటేషన్‌లు పెండింగ్‌లో ఉన్న ప్రత్యేక లాక్‌లను క్యూలో ఉంచిన తర్వాత వాటికి ప్రాధాన్యతనిస్తాయి, అయితే ఉత్పత్తిలో ఆకలితో అలమటిస్తున్నట్లయితే మీరు మీ నిర్దిష్ట టూల్‌చెయిన్ మరియు ప్లాట్‌ఫారమ్ కోసం దీన్ని ధృవీకరించాలి.

std::condition_variableతో ఉపయోగించడానికి std::shared_mutex సురక్షితమేనా?

std::condition_variableకి std::unique_lock అవసరం, కనుక ఇది నేరుగా std::shared_mutexకి అనుకూలంగా లేదు. మీరు భాగస్వామ్య మ్యూటెక్స్‌ని పట్టుకుని షరతుపై వేచి ఉండాల్సిన అవసరం ఉన్నట్లయితే, std::shared_mutex std::shared_lockతో జతచేయబడిన std::condition_variable_anyని ఉపయోగించండి.

నేను std::shared_mutexని ఉపయోగించిన ప్రతిసారీ వ్యాఖ్యలను జోడించాలా?

కనీసం, మ్యూటెక్స్ ఏ డేటాను రక్షిస్తుంది మరియు అది నిర్వహించే మార్పులను వివరించడానికి దాని ప్రకటనపై వ్యాఖ్యానించండి. ప్రతి లాక్ సైట్‌లో, భాగస్వామ్య వర్సెస్ ఎక్స్‌క్లూజివ్ యాక్సెస్ ఎందుకు ఎంపిక చేయబడిందో వివరిస్తూ సంక్షిప్త వ్యాఖ్య కోడ్ సమీక్షకులు మరియు భవిష్యత్తు నిర్వహణదారులకు గణనీయమైన విలువను జోడిస్తుంది. పునరుత్పత్తి మరియు పరిష్కరించడానికి కష్టతరమైన వాటిలో కాన్కరెన్సీ బగ్‌లు ఉన్నాయి, కాబట్టి స్పష్టమైన, ఖచ్చితమైన వ్యాఖ్యలలో పెట్టుబడి అనేక రెట్లు డివిడెండ్‌లను చెల్లిస్తుంది.


సంక్లిష్ట సిస్టమ్‌లను నిర్వహించడం — ఉమ్మడి C++ కోడ్ లేదా మొత్తం వ్యాపార ఆపరేషన్ అయినా — సరైన సాధనాలు మరియు స్పష్టమైన నిర్మాణాన్ని కోరుతుంది. Mewayz అనేది 207-మాడ్యూల్ వ్యాపార OS, ఇది మార్కెటింగ్, CRM, ఇ-కామర్స్, అనలిటిక్స్ మరియు మరిన్నింటికి ఒకే విధమైన స్పష్టతను తీసుకురావడానికి 138,000 మంది వినియోగదారులచే విశ్వసించబడింది, అన్నింటినీ ఒకే ప్లాట్‌ఫారమ్‌లో కేవలం నెలకు $19తో ప్రారంభమవుతుంది. డజన్ల కొద్దీ డిస్‌కనెక్ట్ చేయబడిన సాధనాలను గారడీ చేయడం ఆపి, చక్కగా రూపొందించిన సాఫ్ట్‌వేర్‌తో మీ వ్యాపారాన్ని నిర్వహించడం ప్రారంభించండి. ఈరోజు app.mewayz.comలో Mewayzని ప్రయత్నించండి మరియు మీ బృందం పని చేసే విధానాన్ని ఏకీకృత సిస్టమ్ ఎలా మారుస్తుందో చూడండి.

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