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 сыяктуу платформага тиешелүү чечимдерге таянышы керек болчу, болбосо Boost сыяктуу үчүнчү тараптын китепканаларын колдонушмак. C++17 стандарттык комитети бул боштукту таанып, аны түздөн-түз чечүү үчүн std::shared_mutex дегенди башына киргизди.

Негизги идея түз: көптөгөн реалдуу программаларда маалыматтар жазылгандан алда канча көп окулат. Стандарттык std::mutex бардык кирүү мүмкүнчүлүгүн сериялаштырат — камтылган окуйт — бул керексиз тоскоолдуктарды жаратат. std::shared_mutex эки кулпулоо режимин айырмалоо менен бул чектөөнү алып салат:

  • Бөлүшүлгөн (окуу) кулпуlock_shared() аркылуу алынган; бир нече жип муну бир убакта кармап турат, бул аны бир убакта окуу үчүн идеалдуу кылат.
  • Эксклюзивдүү (жазуу) кулпуlock() аркылуу алынган; Муну бир убакта бир гана жип кармап турушу мүмкүн жана ал кармалып турганда бөлүшүлгөн кулпуларга уруксат берилбейт.
  • std::shared_lock — курулушта lock_shared() жана жок кылынганда unlock_shared() чакырып, ресурстардын агып кетишинин алдын алган RAII орогуч.
  • std::unique_lock / std::lock_guard — эксклюзивдүү режимде колдонулат, бул жазуу операцияларынын толук корголушун жана өзгөчө кырдаалдардын коопсуздугун камсыз кылат.

Бул кош режимдүү дизайн std::shared_mutex файлын кэштер, конфигурация реестрлери жана окуулар жумуш жүктөмүндө басымдуулук кылган бардык маалымат структуралары сыяктуу сценарийлер үчүн табигый ылайыктуу кылат.

Сиз std::shared_mutexти комментарийлер менен реалдуу коддо кантип колдоносуз?

Коддо std::shared_mutex колдонгон комментарийлер өзгөчө баалуу, анткени параллелдүүлүк логикасы жөнүндө ой жүгүртүү кыйынга турат. Жакшы жайгаштырылган комментарийлер эмне үчүн өзгөчө кулпу түрү тандалганын түшүндүрөт, бул келечектеги тейлөөчүлөрдүн кокустан маалымат жарыштарын киргизүү коркунучун кескин азайтат. Бул жерде типтүү үлгү:

#кирүү 
#include <тартипсиз_карта>
#include 

класс ConfigRegistry {
    өзгөрүлүүчү std::shared_mutex mtx_; // төмөндөгү картаны коргойт
    std::unordered_map data_;

коомдук:
    // Окуу жолу: бир нече жиптер муну бир убакта чакырышы мүмкүн
    std::string get(const std::string& key) const {
        std::shared_lock lock(mtx_); // жалпы кулпу — бир убакта окуу үчүн коопсуз
        auto it = data_.find(key);
        аны кайтаруу != data_.end() ? it->ikinci : "";
    }

    // Жазуу жолу: эксклюзивдүү мүмкүнчүлүк талап кылынат
    void set(const std::string& key, const std::string& val) {
        std::unique_lock lock(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() кошот. C++17'нин std::shared_mutex жеңилирээк ишке ашыруу үчүн мөөнөттүү варианттарды түшүрөт. Эгер сизге бөлүшүлгөн жолдо убакытты бекитүү керек болсо, 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 менен түз шайкеш келбейт. Эгер жалпы мутексти кармап турганда бир шартты күтүшүңүз керек болсо, BasicLockable түрү менен иштеген std::condition_variable_any колдонуңуз, анын ичинде std::shared_lock менен жупташкан std::shared_mutex.

Мен std::shared_mutex колдонгон сайын жорумдарды кошушум керекпи?

Жок дегенде, мутекстин декларациясына комментарий бериңиз, ал кандай маалыматтарды коргой турганын жана ал сактаган инварианттарды сүрөттөп бериңиз. Ар бир кулпулоо сайтында эмне үчүн бөлүштүрүлгөн жана эксклюзивдүү жетүү тандалганын түшүндүргөн кыскача комментарий кодду карап чыгуучулар жана келечектеги тейлөөчүлөр үчүн олуттуу мааниге ээ. Кошумча каталарды кайра чыгаруу жана оңдоо эң кыйын болуп саналат, андыктан так, так комментарийлерге инвестиция көп эсе көп пайда берет.


Татаал системаларды башкаруу - бир эле учурда C++ коду болобу же бүтүндөй бизнес операциясы болобу - туура шаймандарды жана так структураны талап кылат. Mewayz бул маркетинг, CRM, электрондук коммерция, аналитика жана башкаларга ошол эле түшүнүктү алып келүү үчүн 138,000ден ашык колдонуучулар ишенген 207 модулдук бизнес OS, бардыгы бир платформада айына $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