Hacker News

Std:Shared_mutex ከ C++17 መረዳት

አስተያየቶች

2 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

ኤስዲ መረዳት::shared_mutex ከC++17

std ::shared_mutex፣ በC++17 ውስጥ የገባው፣ ብዙ ክሮች በጋራ (ማንበብ) ቁልፎችን በአንድ ጊዜ እንዲይዙ የሚያስችል የማመሳሰል ጥንታዊ ሲሆን ለጽሑፍ ስራዎች ልዩ መዳረሻን ያረጋግጣል። ለሶስተኛ ወገን ቤተ-መጻሕፍት ወይም መድረክ-ተኮር ኤፒአይዎች ሳይደርሱ አንባቢ-ጸሐፊን መቆለፍን ተግባራዊ ለማድረግ ለገንቢዎች ንጹህና ደረጃውን የጠበቀ መንገድ በመስጠት በዘመናዊው C++ ውስጥ በጣም ከተለመዱት የመመሳሰል ተግዳሮቶች አንዱን ይፈታል።

std በትክክል ምንድን ነው::shared_mutex እና ለምን በC++17 ውስጥ ተጨመረ?

ከC++17 በፊት፣ አንባቢ-ጸሐፊ ትርጉም የሚያስፈልጋቸው ገንቢዎች እንደ መድረክ-ተኮር መፍትሄዎች እንደ pthread_rwlock_t በPOSIX ሲስተሞች ላይ ወይም SRWLOCK ላይ በዊንዶውስ ላይ መደገፍ ነበረባቸው፣ አለበለዚያ እንደ ማበልጸጊያ ያሉ የሶስተኛ ወገን ቤተ-ፍርግሞችን መጠቀም ነበረባቸው። የC++17 ስታንዳርድ ኮሚቴ ይህንን ክፍተት ተገንዝቦ std::shared_mutexን በቀጥታ ለመፍታት በ ርዕስ ላይ አስተዋውቋል።

ዋናው ሃሳቡ ቀጥተኛ ነው፡ በብዙ የገሃድ አለም ፕሮግራሞች ውስጥ መረጃው ከተፃፈው በበለጠ ብዙ ጊዜ ይነበባል። መደበኛ std::mutex ሁሉንም መዳረሻ ተከታታይ ያደርገዋል - ያነባል - ይህም አላስፈላጊ ማነቆዎችን ይፈጥራል። std::shared_mutex በሁለት የመቆለፍ ሁነታዎች መካከል በመለየት ያንን ገደብ ያነሳል፡

  • የተጋራ (የተነበበ) መቆለፊያ — በየተቆለፈ የተጋራ(); ብዙ ክሮች ይህንን በአንድ ጊዜ ሊይዙት ይችላሉ፣ ይህም ለጋራ ንባብ ተስማሚ ያደርገዋል።
  • ልዩ (የጻፍ) መቆለፊያ — የተገኘው በመቆለፊያ(); ይህንን በአንድ ጊዜ አንድ ክር ብቻ ሊይዝ ይችላል፣ እና በሚቆይበት ጊዜ ምንም የጋራ መቆለፊያዎች አይፈቀዱም።
  • std::የተጋራ_መቆለፊያ — በግንባታ ላይ መቆለፊያ_የተጋራ() እና መክፈቻ_የተጋራ()ን በማጥፋት የሚጠራ የRAII መጠቅለያ የሃብት ፍንጣቂዎችን ይከላከላል።
  • std::ልዩ_መቆለፊያ / std ::የመቆለፊያ_ጠባቂ — በልዩ ሁኔታ ጥቅም ላይ የዋለ፣ የአጻጻፍ ስራዎች ሙሉ በሙሉ የተጠበቁ እና ልዩ-ደህንነታቸው የተጠበቀ መሆኑን ያረጋግጣል።

ይህ ባለሁለት ሞድ ንድፍ std ::shared_mutexን እንደ መሸጎጫዎች፣ የውቅረት መዝገብ ቤቶች እና ማንኛውም የተነበበ የውሂብ መዋቅር የስራ ጫናውን እንዲቆጣጠር ያደርገዋል።

እንዴት std::shared_mutexን በእውነተኛ ኮድ ከአስተያየቶች ጋር ይጠቀማሉ?

በኮድ ውስጥ ያሉ አስተያየቶች std::shared_mutexን የሚጠቀሙ ናቸው ምክንያቱም concurrency ሎጂክ ለማመዛዘን በጣም ከባድ ነው። በደንብ የተቀመጡ አስተያየቶች ለምንየተለየ የመቆለፊያ አይነት እንደተመረጠ ያብራራሉ፣ ይህም የወደፊት ጠባቂዎች በድንገት የውሂብ ውድድርን የማስተዋወቅ አደጋን በእጅጉ ይቀንሳል። አንድ የተለመደ ንድፍ ይኸውና፡

#ያካትቱ 
#ያካትተው <ያልታዘዘ_ካርታ>
ን ይጨምራል

ክፍል ConfigRegistry {
    ሊለወጥ የሚችል std::shared_mutex mtx_; // ከታች ያለውን ካርታ ይከላከላል
    std:: ያልታዘዘ_ካርታ data_;

ይፋዊ፡
    // ዱካ አንብብ፡ ብዙ ክሮች ይህንን በአንድ ጊዜ ሊጠሩት ይችላሉ።
    std :: string get (const std :: string & key) const {
        std :: የተጋራ_መቆለፊያ መቆለፊያ (mtx_); // የተጋራ መቆለፊያ - ለተመሳሳይ ንባብ ደህንነቱ የተጠበቀ
        auto it = data_.ማግኘት (ቁልፍ);
        መመለስ!= ዳታ_.መጨረሻ()? it-> ሰከንድ : "";
    }

    // መንገድ ይፃፉ፡ ልዩ መዳረሻ ያስፈልጋል
    ባዶ ስብስብ(const std::string& key፣const std::string& val) {
        std :: ልዩ_መቆለፊያ መቆለፊያ (mtx_); // ልዩ መቆለፊያ - ሁሉንም አንባቢዎች ያግዳል።
        ዳታ_[ቁልፍ] = val;
    }
}፤
አስተያየቶቹ ኮዱ የሚሰራውን ብቻ ከመድገም ይልቅ ከእያንዳንዱ የመቆለፊያ ምርጫ በስተጀርባ ያለውን ሀሳብ እንዴት እንደሚያብራሩ አስተውል። ይህ የወርቅ ደረጃው ነው፡ አስተያየቶች መልስ መስጠት ያለባቸው ለምን እንጂ ምን መሆን የለበትም። በ mutex ላይ ያለው የተለዋዋጭ ቁልፍ ቃል አሁንም መቆለፍ በሚችልበት ጊዜ ማግኘት() const እንዲታወቅ ያስችለዋል፣ የተለመደ እና ፈሊጥ ጥለት።

ቁልፍ ግንዛቤ፡ ሁልጊዜ የ RAII መቆለፊያ መጠቅለያዎችን (std :: የተጋራ_መቆለፊያ, std :: ልዩ_መቆለፊያ) በstd ::shared_mutex - በጭራሽ መቆለፊያ() እና መክፈቻ() በእጅ አይጥሩ። ልዩ ሁኔታዎች ባሉበት በእጅ መቆለፍ ወደ መቆለፊያዎች እና ላልተገለጸ ባህሪ የተረጋገጠ መንገድ ነው።

ከ 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_እስከ()ን ለጊዜያዊ ሙከራዎች ይጨምራል። የC++17's std::shared_mutex ለቀላል ትግበራ በጊዜ የተቀመጡትን ልዩነቶች ይጥላል። በተጋራው መንገድ ላይ በጊዜ መቆለፍ ከፈለጉ std ::shared_timed_mutex እንዳለ ይቆያል እና ሁለቱም ዓይነቶች ሙሉ ለሙሉ መደበኛ ናቸው።

ከመቆለፊያ ነጻ ለሆኑ አማራጮች std>> አቶሚክ ከጥንቃቄ የማስታወሻ ቅደም ተከተል ጋር ተዳምሮ አንዳንድ ጊዜ ሙቴክስ ለቀላል ባንዲራዎች ወይም ቆጣሪዎች ሊተካ ይችላል፣ነገር ግን ለተወሳሰቡ የውሂብ አወቃቀሮች std::shared_mutex በመደበኛ ቤተ-መጽሐፍት ውስጥ በጣም ሊነበብ የሚችል እና ሊቆይ የሚችል መፍትሄ ሆኖ ይቆያል።

ብዙ ጊዜ የሚጠየቁ ጥያቄዎች

std::shared_mutex ረሃብን ሊያስከትል ይችላል?

አዎ ይችላል። አዲስ የተጋሩ-መቆለፊያ ያዢዎች ያለማቋረጥ መምጣታቸውን ከቀጠሉ፣ ልዩ የሆነ መቆለፊያ ጠያቂ ላልተወሰነ ጊዜ ሊጠብቅ ይችላል - የታወቀ የጸሐፊ ረሃብችግር። የC++ መስፈርት የተለየ የፍትሃዊነት ፖሊሲን አይጠይቅም፣ ስለዚህ ባህሪው በአተገባበሩ ላይ የተመሰረተ ነው። በተግባር፣ አብዛኛው መደበኛ የቤተ-መጻህፍት አተገባበር ከተሰለፉ በኋላ በመጠባበቅ ላይ ያሉ ልዩ መቆለፊያዎችን ቅድሚያ ይሰጣሉ፣ነገር ግን ረሃብ በምርት ላይ አሳሳቢ ከሆነ ይህንን ለርስዎ መሣሪያ ሰንሰለት እና መድረክ ማረጋገጥ አለብዎት።

std::shared_mutex ከ std ::ሁኔታ_ተለዋዋጭ ጋር ለመጠቀም ደህንነቱ የተጠበቀ ነው?

std ::ሁኔታ_ተለዋዋጭ std ::ልዩ_መቆለፊያ ያስፈልገዋል፣ስለዚህ ከstd::shared_mutex ጋር በቀጥታ ተኳሃኝ አይደለም። የጋራ ሙቴክስ በሚይዙበት ጊዜ ሁኔታ ላይ መጠበቅ ካስፈለገዎት std::condition_variable_ anyን ይጠቀሙ ይህም ከማንኛውም መሰረታዊ ሊቆለፍ የሚችል አይነት ከ std ::shared_mutex ጋር የተጣመረ ከ std ::የተጋራ_መቆለፊያ ጋር አብሮ ይሰራል።

std::shared_mutex በተጠቀምኩ ቁጥር አስተያየቶችን ማከል አለብኝ?

ቢያንስ የ mutex ማስታወቂያ ምን ውሂብ እንደሚከላከል እና እንደሚያስቀምጠው ለመግለጽ አስተያየት ይስጡ። በእያንዳንዱ የመቆለፊያ ጣቢያ፣ ለምን የተጋራ እና ልዩ መዳረሻ እንደተመረጠ የሚገልጽ አጭር አስተያየት ለኮድ ​​ገምጋሚዎች እና ለወደፊት ተቆጣጣሪዎች ጠቃሚ እሴትን ይጨምራል። የመለዋወጫ ሳንካዎች ለመባዛት እና ለማስተካከል በጣም ከባድ ከሚባሉት ውስጥ ናቸው፣ ስለዚህ ግልፅ እና ትክክለኛ አስተያየቶች ላይ የሚደረገው ኢንቬስትመንት ብዙ እጥፍ ትርፍ ያስከፍላል።


ውስብስብ ስርዓቶችን ማስተዳደር - በተመሳሳይ ጊዜ የC++ ኮድ ወይም አጠቃላይ የንግድ ሥራ - ትክክለኛ መሳሪያዎችን እና ግልጽ መዋቅርን ይፈልጋል። Mewayzበአንድ መድረክ በወር ከ$19 ጀምሮ ያንኑ ግልፅነት ለገበያ፣ CRM፣ ኢ-ኮሜርስ፣ ትንታኔ እና ሌሎችም ለማምጣት ከ138,000 በላይ ተጠቃሚዎች የታመነ ባለ 207-ሞዱል የንግድ ስርዓተ ክወና ነው። በደርዘን የሚቆጠሩ የተቋረጡ መሳሪያዎችን መጨናነቅ ያቁሙ እና ንግድዎን በጥሩ ሁኔታ በተሰራ ሶፍትዌር በትክክል ማስኬድ ይጀምሩ። Mewayzን ዛሬ በapp.mewayz.com ላይ ይሞክሩ እና የተዋሃደ ስርዓት እንዴት የቡድንዎ አሰራርን እንደሚለውጥ ይመልከቱ።