Std-ны аңлау: C ++ 17-дән Shared_mutex
Аңлатмалар
Mewayz Team
Editorial Team
std :: C ++ 17
дан уртак_мутексны аңлау C ++ 17 белән кертелгәнstd :: shared_mutex - синхронизация примитивы, ул берничә җепне бер үк вакытта уртак (уку) йозакларын тотарга мөмкинлек бирә, шул ук вакытта язу операцияләренә эксклюзив керү мөмкинлеген тәэмин итә. Бу хәзерге C ++ иң еш очрый торган проблемаларның берсен чишә, өченче як китапханәләренә яки платформага хас API'ларга ирешмичә, укучы-язучының йозакларын кертү өчен чиста, стандарт ысул биреп.
Нәрсә ул 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 :: unique_lock / std :: lock_guard - эксклюзив режим белән кулланыла, язу операцияләренең тулысынча сакланганын һәм куркынычсыз булуын тәэмин итә.
Бу ике режимлы дизайн std :: shared_mutex кэш, конфигурация реестры кебек сценарийларга табигый туры килә, һәм укыган эш структурасы өстенлек итә.
Сез комментарийлар белән реаль кодта std :: shared_mutex ничек кулланасыз?
std :: shared_mutex кулланган кодтагы аңлатмалар аеруча кыйммәт, чөнки туры килү логикасы турында уйлау авыр. Яхшы урнаштырылган аңлатмалар ни өчен билгеле йозак төре сайланганын ачыклый, бу булачак саклаучыларның очраклы рәвештә мәгълүмат узышларын кертү куркынычын киметә. Менә типик үрнәк:
# кертү
# кертү
# кертү
ConfigRegistry класс {
үзгәртелә торган std :: shared_mutex mtx_; // астагы картаны саклый
std :: тәртипсез_ картасы data_;
җәмәгать:
// pathлны укыгыз: берничә җеп бер үк вакытта шалтыратырга мөмкин
std :: string get (const std :: string & key) const {
std :: shared_lock lock (mtx_); // уртак йозак - бер үк вакытта уку өчен куркынычсыз
автомат рәвештә = data_.find (ачкыч);
кире кайтар! = data_.end ()? it-> икенче: "";
}
// pathл языгыз: эксклюзив керү кирәк
бушлык җыелмасы (const std :: string & key, const std :: string & val) {
std :: уникаль_лок йозак (mtx_); // эксклюзив йозак - барлык укучыларны блоклый
мәгълүмат_ [ачкыч] = val;
}
};
Игътибар итегез, аңлатмалар кодның нәрсә эшләгәнен кабатлау урынына, һәрбер йозак сайлау артындагы ниятне ничек аңлаталар. Бу алтын стандарт: аңлатмалар ни түгел, ни өчен җавап бирергә тиеш. Мутексдагы <код> үзгәртелә торган ачкыч сүзе get () const дип игълан ителергә мөмкинлек бирә, шул ук вакытта бикләнгән, гомуми һәм идиоматик үрнәк.
Төп төшенчәләр: RAәрвакыт RAII йозак төргечләрен кулланыгыз (
std :: shared_lock,std :: unique_lock)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_until () өсти. C ++ 17's 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 кулланган саен аңлатмалар өстәргә тиешме?
Минимум, мутекс декларациясенә аңлатма бирегез, ул нинди мәгълүматны саклый һәм инвариантларны саклый. Eachәрбер йозак сайтында ни өчен уртак эксклюзив керү сайланганын аңлаткан кыска аңлатма код рецензияләүчеләре һәм булачак саклаучылар өчен мөһим кыйммәт өсти. Килешү хата җибәрү һәм төзәтү иң кыеннары арасында, шуңа күрә ачык, төгәл аңлатмаларга инвестицияләр дивидендлар күп тапкыр түли.
<сәгать>Катлаулы системалар белән идарә итү - бер үк вакытта C ++ коды яки бөтен бизнес операциясе - дөрес кораллар һәм чиста структура таләп итә. Mewayz - 207-модульле бизнес ОС, 138,000 артык кулланучы ышанычлы, маркетинг, CRM, электрон сәүдә, аналитика һәм башкаларга шул ук ачыклыкны китерә, барысы да бер платформада аена 19 доллардан башлана. Дистәләгән өзелмәгән кораллар белән бәйләнешне туктатыгыз һәм яхшы эшләнгән программа тәэминаты төгәллеге белән үз бизнесыгызны эшләтеп җибәрегез. Мевайзны app.mewayz.com сайтында карагыз һәм бердәм системаның сезнең команда эшен ничек үзгәртүен карагыз.
We use cookies to improve your experience and analyze site traffic. Cookie Policy