Hacker News

Std نى چۈشىنىش: C ++ 17 دىن Shared_mutex

باھا

2 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

C ++ 17

دىن std :: shared_mutex نى چۈشىنىش C ++ 17 دە تونۇشتۇرۇلغان

std :: shared_mutex ماس قەدەملىك ئىپتىدائىي بولۇپ ، كۆپ خىل تېمىنىڭ بىرلا ۋاقىتتا ئورتاقلىشىش (ئوقۇش) قۇلۇپىنى ساقلاپ ، يېزىش مەشغۇلاتىغا مەخسۇس كاپالەتلىك قىلىدۇ. ئۇ پروگرامما ئاچقۇچىلارغا ئۈچىنچى تەرەپ كۈتۈپخانىلىرى ياكى سۇپا مەخسۇس API لىرىغا يەتمەي تۇرۇپ ، ئوقۇرمەنلەرگە يازغۇچى قۇلۇپنى يولغا قويۇشنىڭ پاكىز ، ئۆلچەملىك يولىنى بېرىش ئارقىلىق زامانىۋى C ++ دىكى ئەڭ كۆپ ئۇچرايدىغان ماسلىشىش خىرىسلىرىنى ھەل قىلىدۇ.

زادى نېمە std :: shared_mutex ۋە نېمىشقا C ++ 17 گە قوشۇلدى؟

C ++ 17 دىن بۇرۇن ، ئوقۇرمەن-يازغۇچىنىڭ مەنىسىگە ئېھتىياجلىق پروگراممېرلار POSIX سىستېمىسىدىكى pthread_rwlock_t ياكى Windows دىكى SRWLOCK غا ئوخشاش سۇپا خاراكتېرلىك ھەل قىلىش ئۇسۇللىرىغا تايىنىشى كېرەك ئىدى ، ياكى ئۇلار Boost قاتارلىق ئۈچىنچى تەرەپ كۈتۈپخانىلارنى ئىشلىتەتتى. C ++ 17 ئۆلچەملىك كومىتېتى بۇ پەرقنى تونۇپ يەتتى ھەمدە بىۋاسىتە ھەل قىلىش ئۈچۈن ماۋزۇسىدا std :: shared_mutex نى تونۇشتۇردى.

يادرولۇق ئىدىيە بىۋاسىتە: نۇرغۇنلىغان رېئال دۇنيا پروگراممىلىرىدا سانلىق مەلۇماتلار يېزىلغانغا قارىغاندا كۆپ ئوقۇلىدۇ. ئۆلچەملىك std :: mutex بارلىق زىيارەتلەرنى تەرتىپكە سالىدۇ - ئوقۇشنى ئۆز ئىچىگە ئالىدۇ - بۇ زۆرۈر بولمىغان توسالغۇلارنى پەيدا قىلىدۇ. std :: shared_mutex ئىككى خىل قۇلۇپلاش ھالىتىنى پەرقلەندۈرۈش ئارقىلىق بۇ چەكلىمىنى بىكار قىلىدۇ:

  • ھەمبەھىر (ئوقۇش) قۇلۇپ - lock_shared () ئارقىلىق سېتىۋېلىندى. بىر نەچچە تېما بىرلا ۋاقىتتا ئۇنى تۇتالايدۇ ، بىرلا ۋاقىتتا ئوقۇشقا ماس كېلىدۇ.
  • ئالاھىدە (يېزىش) قۇلۇپ - قۇلۇپ () ئارقىلىق ئېرىشكەن. بىرلا ۋاقىتتا پەقەت بىرلا تېما ساقلىيالايدۇ ، ئۇ تۇتۇلغاندا ئورتاق قۇلۇپ ئىشلىتىشكە بولمايدۇ.
  • std :: shared_lock - قۇرۇلۇشتىكى lock_shared () ۋە unlock_shared () دەپ ئاتىلىدىغان RAII ئورالمىسى ، بايلىقنىڭ ئېقىپ كېتىشىنىڭ ئالدىنى ئالىدۇ.
  • std :: unique_lock / std :: lock_guard - مەخسۇس ھالەتتە ئىشلىتىلىدۇ ، يېزىش مەشغۇلاتىنىڭ تولۇق قوغدىلىشىغا ۋە بىخەتەر بولۇشىغا كاپالەتلىك قىلىدۇ.

بۇ قوش ھالەتتىكى لايىھە std :: shared_mutex نى غەملەك ، سەپلىمە تىزىملىتىشى ۋە ئوقۇلغان ھەر قانداق سانلىق مەلۇمات قۇرۇلمىسى قاتارلىق ئەھۋاللارغا تەبىئىي ماسلاشتۇرىدۇ.

باھا بىلەن ھەقىقىي كودتا std :: shared_mutex نى قانداق ئىشلىتىسىز؟

std :: shared_mutex نى ئىشلىتىدىغان كودتىكى باھا ئالاھىدە قىممەتلىك ، چۈنكى ماسلىشىش لوگىكىسى ھەققىدە پىكىر يۈرگۈزۈش تەس. ياخشى ئورۇنلاشتۇرۇلغان باھالار نېمە ئۈچۈن مەلۇم بىر قۇلۇپ تىپىنىڭ تاللانغانلىقىنى ئايدىڭلاشتۇرىدۇ ، بۇ كەلگۈسىدىكى قوغدىغۇچىلارنىڭ ئېھتىياتسىزلىقتىن سانلىق مەلۇمات مۇسابىقىسىنى تونۇش خەۋپىنى زور دەرىجىدە تۆۋەنلىتىدۇ. بۇ تىپىك ئەندىزە:

  # ئۆز ئىچىگە ئالغان 
# ئۆز ئىچىگە ئالغان 
#incring 

class ConfigRegistry {
    mutable std :: shared_mutex mtx_; // تۆۋەندىكى خەرىتىنى قوغدايدۇ
    std :: unordered_map  data_;

public:
    // ئوقۇش يولىنى ئوقۇش: بىر نەچچە تېما بىرلا ۋاقىتتا تېلېفون قىلىشى مۇمكىن
    std :: string get (const std :: string & key) const {
        std :: shared_lock lock (mtx_); // ھەمبەھىر قۇلۇپ - بىرلا ۋاقىتتا ئوقۇش ئۈچۈن بىخەتەر
        auto it = data_.find (key);
        ئۇنى قايتۇرۇڭ! = data_.end ()? it-> second: "";
    }

    // يېزىش يولى: مەخسۇس زىيارەت قىلىش تەلەپ قىلىنىدۇ
    void set (const std :: string & key, const std :: string & val) {
        std :: unique_lock lock (mtx_); // مەخسۇس قۇلۇپ - بارلىق ئوقۇرمەنلەرنى توسىدۇ
        data_ [key] = val;
    }
};  

باھالارنىڭ كودنى نېمە ئىش قىلىدىغانلىقىنى قايتا-قايتا بايان قىلماستىن ، بەلكى ھەر بىر قۇلۇپ تاللاشنىڭ مۇددىئاسىنى قانداق چۈشەندۈرگەنلىكىگە دىققەت قىلىڭ. بۇ ئالتۇن ئۆلچەم: باھا نېمە ئەمەس ، نېمە ئۈچۈن دەپ جاۋاب بېرىشى كېرەك. ئۈنسىز ھالەتتىكى ئۆزگىرىشچان ئاچقۇچلۇق سۆز get () نى const دەپ جاكارلاشقا يول قويىدۇ ، ئۇ يەنىلا قۇلۇپلىيالايدۇ ، بۇ ئورتاق ۋە ئۆزگىچە ئەندىزە.

ئاچقۇچلۇق چۈشەنچە: ھەمىشە RAII قۇلۇپ ئورالمىسى ( std :: shared_lock ، std :: unique_lock ) نى 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 :: shared_mutex نىڭ تەجرىبىلىك ئاچقۇچىلارنى بېسىپ چۈشىدىغان ئىنچىكە قىلتاقلىرى بار. ئەڭ خەتەرلىك بولغىنى قۇلۇپنى يېڭىلاش : ئورتاق قۇلۇپنى ئالدى بىلەن قويۇپ بەرمەي مەخسۇس قۇلۇپقا يېڭىلاشنىڭ ھېچقانداق ئۇسۇلى يوق. قويۇپ بەرمەيلا قىلىشقا ئۇرۇنۇش شۇ ھامان قاتمال ھالەتنى كەلتۈرۈپ چىقىرىدۇ ، چۈنكى بۇ تېما ئورتاق قۇلۇپنى ساقلاۋاتقاندا ئورتاق قۇلۇپنى ساقلايدۇ ، ھەر قانداق ئورتاق قۇلۇپ مەۋجۇت بولسىلا ، ئۇ ساقلىغان قۇلۇپنى ئۆز ئىچىگە ئالىدۇ.

يەنە بىر كۆپ ئۇچرايدىغان خاتالىق خاتا دانچىلارنى قوغداش. پروگراممېرلار بەزىدە بەك كەڭ قۇلۇپلىنىپ ، ئوقۇرمەن-يازغۇچى ئەندىزىسىنىڭ مەقسىتىنى مەغلۇب قىلىدۇ ياكى بەك تار قىلىپ ، ئايرىم-ئايرىم ئىككى خىل قۇلۇپ سېتىۋېلىش ئوتتۇرىسىدا ئۆزگىرىشچان دەخلى-تەرۇزغا ئۇچرايدۇ. ئۆزگەرگۈچى مىقدار قۇلۇپلانغاندىن باشقا ، ئۆزگەرمەس قوغدىلىدىغان تەسۋىرلەنگەن باھا گۇرۇپپىلارنىڭ كودنى تەكشۈرۈش جەريانىدا توغرىلىق ھەققىدە پىكىر يۈرگۈزۈشىگە ياردەم بېرىدۇ.

ئىقتىدار سىزنى ھەيران قالدۇرىدۇ. نۇرغۇن يازغۇچىلار بىلەن بولغان تالاش-تارتىش سىستېمىلىرىدا ، 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 () < C ++ 17 نىڭ std :: shared_mutex ئورۇقلىتىشنىڭ ۋاقىت جەدۋىلىنى تاشلايدۇ. ئەگەر ئورتاق بەھرىلىنىدىغان يولدا ۋاقىت قۇلۇپلاشقا ئېھتىياجلىق بولسىڭىز ، std :: shared_timed_mutex يەنىلا مەۋجۇت بولۇپ ، ھەر ئىككى تۈرى تولۇق ئۆلچەملىك.

قۇلۇپسىز تاللاش ئۈچۈن ، std :: ئاتوم ئېھتىياتچان ئىچكى ساقلىغۇچ بىلەن بىرلەشتۈرۈلگەندە بەزىدە ئاۋازسىز ھالەتنى پۈتۈنلەي ئاددىي بايراق ياكى ھېسابلىغۇچقا ئالماشتۇرالايدۇ ، ئەمما مۇرەككەپ سانلىق مەلۇمات قۇرۇلمىسى ئۈچۈن ، std :: shared_mutex ئۆلچەملىك كۈتۈپخانىدا ئەڭ كۆپ ئوقۇشقا بولىدىغان ۋە ساقلىغىلى بولىدىغان ھەل قىلىش چارىسى بولۇپ قالىدۇ.

دائىم سورايدىغان سوئاللار

std :: shared_mutex ئاچلىقنى كەلتۈرۈپ چىقارامدۇ؟

ھەئە ، بولىدۇ. ئەگەر يېڭى ئورتاق قۇلۇپ ئاچقۇچىلار توختىماي يېتىپ كەلسە ، مەخسۇس قۇلۇپ تەلەپ قىلغۇچى مۇددەتسىز ساقلىشى مۇمكىن - كلاسسىك يازغۇچى ئاچارچىلىق مەسىلىسى. C ++ ئۆلچىمى كونكرېت ئادىللىق سىياسىتىنى بەلگىلىمەيدۇ ، شۇڭا ھەرىكەت يولغا قويۇشقا باغلىق. ئەمەلىيەتتە ، كۆپىنچە ئۆلچەملىك كۈتۈپخانىلارنى يولغا قويۇش ئۆچرەتتە تۇرغاندىن كېيىن ساقلىنىۋاتقان مەخسۇس قۇلۇپنى ئالدىنقى ئورۇنغا قويىدۇ ، ئەمما ئاچارچىلىق ئىشلەپچىقىرىشقا كۆڭۈل بۆلىدىغان بولسا ، بۇنى مەخسۇس قورال ساندۇقىڭىز ۋە سۇپىڭىز ئۈچۈن تەكشۈرۈپ بېقىشىڭىز كېرەك.

std :: shared_mutex نى std :: condition_variable بىلەن ئىشلىتىشكە بىخەتەرمۇ؟

std :: condition_variable std :: unique_lock نى تەلەپ قىلىدۇ ، شۇڭا ئۇ std :: shared_mutex بىلەن بىۋاسىتە ماسلاشمايدۇ. ئەگەر ئورتاق ئاۋازنى ساقلاش جەريانىدا بىر شەرتنى ساقلاشقا توغرا كەلسە ، std :: condition_variable_any نى ئىشلىتىڭ ، ئۇ ھەر قانداق BasicLockable تىپى بىلەن ئىشلەيدۇ ، مەسىلەن std :: shared_mutex std :: shared_lock .

.

ھەر قېتىم std :: shared_mutex نى ئىشلەتكەندە باھا قوشۇشىم كېرەكمۇ؟

ھېچ بولمىغاندا ، ئاۋازنىڭ باياناتىغا باھا بېرىپ ، ئۇنىڭ قانداق سانلىق مەلۇماتنى قوغدايدىغانلىقى ۋە ئۆزگەرمەسلىكىنى تەسۋىرلەڭ. ھەر بىر قۇلۇپ بېكەتتە ، ئورتاق بەھرىلىنىش بىلەن مەخسۇس زىيارەتنىڭ نېمە ئۈچۈن تاللانغانلىقى چۈشەندۈرۈلگەن قىسقىچە باھا كود تەكشۈرگۈچىلەر ۋە كەلگۈسىدىكى قوغدىغۇچىلار ئۈچۈن مۇھىم قىممەت قوشىدۇ. ماس كېلىدىغان كەمتۈكلەر كۆپەيتىش ۋە ئوڭشاش ئەڭ قىيىنلارنىڭ بىرى ، شۇڭا ئېنىق ، ئېنىق باھاغا سېلىنغان مەبلەغ كۆپ قېتىم پايدا بېرىدۇ.


مۇرەككەپ سىستېمىلارنى باشقۇرۇش - مەيلى بىرلا ۋاقىتتا C ++ كودى ياكى پۈتكۈل سودا مەشغۇلاتى بولسۇن - توغرا قورال ۋە ئېنىق قۇرۇلمىنى تەلەپ قىلىدۇ. Mewayz بولسا 207 مودۇللۇق سودا OS بولۇپ ، 138،000 دىن ئارتۇق ئابونت ئىشەنچلىك ، بازارشۇناسلىق ، CRM ، ئېلېكترونلۇق سودا ، ئانالىز ۋە باشقالارغا ئوخشاش ئېنىقلىقنى ئېلىپ كېلىدۇ ، ھەممىسى بىر سۇپادا ھەر ئايدا ئاران 19 دوللار. ئۈزۈلۈپ قالغان ئون نەچچە قورالنى باغلاشنى توختىتىڭ ھەمدە ياخشى لايىھەلەنگەن يۇمشاق دېتالنىڭ ئىنچىكەلىكى بىلەن سودىڭىزنى باشلاڭ. بۈگۈن Mewayz نى app.mewayz.com دىن سىناپ بېقىڭ ھەمدە بىرلىككە كەلگەن سىستېمىنىڭ گۇرۇپپىڭىزنىڭ خىزمەت ئۇسۇلىنى قانداق ئۆزگەرتىدىغانلىقىنى كۆرۈڭ.

پايدا ئالىدۇ.

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