Разбирање на Std:Shared_mutex од C++17
Коментари
Mewayz Team
Editorial Team
Разбирање на 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
класа ConfigRegistry {
mutable 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->второ : "";
}
// Патека за пишување: потребен е ексклузивен пристап
празен сет (const std::string& key, const std::string& val) {
std:: unique_lock lock (mtx_); // ексклузивно заклучување — ги блокира сите читатели
data_[клуч] = val;
}
};
Забележете како коментарите ја објаснуваат намерата зад секој избор на заклучување наместо само да го повторите она што го прави кодот. Ова е златниот стандард: коментарите треба да одговорат зошто, а не што. Клучниот збор mutable на mutex дозволува 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?
Во најмала рака, коментирајте ја декларацијата на mutex за да опишете кои податоци ги заштитува и непроменливите што ги одржува. На секоја локација за заклучување, краток коментар што објаснува зошто е избран споделен наспроти ексклузивен пристап додава значителна вредност за прегледувачите на кодот и идните одржувачи. Истовремените грешки се едни од најтешките за репродукција и поправка, така што вложувањето во јасни, прецизни коментари дава дивиденди многукратно.
Управувањето со сложени системи - без разлика дали е истовремен C++ код или цела деловна операција - бара соодветни алатки и јасна структура. Mewayz е деловен оперативен систем со 207 модули на кој му веруваат над 138.000 корисници за да ја донесе истата јасност во маркетингот, CRM, е-трговијата, аналитиката и повеќе, сето тоа во една платформа почнувајќи од само 19 долари месечно. Престанете да жонглирате со десетици исклучени алатки и почнете да го водите вашиот бизнис со прецизност на добро дизајниран софтвер. Пробајте го Mewayz денес на app.mewayz.com и видете како унифициран систем го трансформира начинот на кој работи вашиот тим.
We use cookies to improve your experience and analyze site traffic. Cookie Policy