Hacker News

Фаҳмидани Std:Shared_mutex аз C++17

Шарҳҳо

2 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Фаҳмидани std::shared_mutex аз C++ 17

std::shared_mutex, ки дар C++17 муаррифӣ шудааст, як примитиви ҳамоҳангсозӣ мебошад, ки ба якчанд ришта имкон медиҳад, ки ҳамзамон қулфҳои муштарак (хондан) -ро нигоҳ дошта, дастрасии истисноиро барои амалиёти навиштан таъмин кунанд. Он яке аз мушкилоти маъмултарини ҳамзамон дар C++-и муосирро тавассути додани роҳи тоза ва стандартии амалӣ кардани қулфи хонанда-нависанда бидуни дастрасӣ ба китобхонаҳои тарафи сеюм ё API-ҳои платформаи мушаххас ҳал мекунад.

std::shared_mutex маҳз чист ва чаро он дар C++17 илова карда шудааст?

Пеш аз C++17, таҳиягароне, ки ба семантикаи хонанда-нависанда эҳтиёҷ доштанд, бояд ба ҳалли мушаххаси платформа ба мисли pthread_rwlock_t дар системаҳои POSIX ё SRWLOCK дар Windows такя мекарданд, ё онҳо китобхонаҳои тарафи сеюмро ба мисли Boost истифода мебурданд. Кумитаи стандартии 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 
#include <харитаи_бетартиб>
#include 

class ConfigRegistry {
    тағйирёбанда std::shared_mutex mtx_; // харитаи зерро муҳофизат мекунад
    std :: unordered_map data_;

оммавӣ:
    // Роҳи хониш: риштаҳои сершумор метавонанд дар як вақт инро даъват кунанд
    std::string get(const std::string& key) const {
        std::shared_lock lock(mtx_); // Қулфи муштарак — бехатар барои хондани ҳамзамон
        худкор он = data_.find (калид);
        онро баргардонед!= data_.end() ? он->дуюм: "";
    }

    // Роҳи навиштан: дастрасии истисноӣ лозим аст
    маҷмӯи void (const std::string& key, const std::string& val) {
        std :: қулфи беҳамто (mtx_); // қулфи истисноӣ — ҳамаи хонандагонро маҳкам мекунад
        data_[калид] = val;
    }
};

Аҳамият диҳед, ки чӣ гуна шарҳҳо нияти паси ҳар як интихоби қулфро мефаҳмонанд, на танҳо такрор кардани он чизе, ки код мекунад. Ин стандарти тиллоӣ аст: шарҳҳо бояд ба чаро ҷавоб диҳанд, на чӣ. Калимаи калидии mutable дар мутекс ба get() имкон медиҳад, ки const эълон карда шавад, дар ҳоле ки қодир ба қулф аст, як намунаи маъмул ва идиоматикӣ.

Фаъолияти калидӣ: Ҳамеша бастаҳои қулфи RAII (std::shared_lock, std::unique_lock) бо std::shared_mutex - ҳеҷ гоҳ ба 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() илова мекунад. std::shared_mutex-и C++17 вариантҳои вақтро барои татбиқи осонтар хориҷ мекунад. Агар ба шумо қулфи вақт дар роҳи муштарак лозим бошад, std::shared_timed_mutex дастрас боқӣ мемонад ва ҳарду намуд комилан стандартӣ мебошанд.

Барои алтернативаҳои бидуни қулф, std::atomic дар якҷоягӣ бо фармоиши эҳтиёткоронаи хотира баъзан метавонад мутексро комилан барои парчамҳо ё ҳисобкунакҳои оддӣ иваз кунад, аммо барои сохторҳои мураккаби додаҳо, 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-модули ОС-и тиҷорӣ мебошад, ки аз ҷониби зиёда аз 138,000 корбарон эътимод доранд, ки ҳамон як возеҳиятро ба маркетинг, CRM, тиҷорати электронӣ, таҳлил ва ғайра меорад, ҳама дар як платформа аз ҳамагӣ $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