C++ 17-ээс Std:Shared_mutex-ийг ойлгох
Сэтгэгдэл
Mewayz Team
Editorial Team
C++17-ийн std::shared_mutex-ийг ойлгох нь
std::shared_mutex, C++17-д нэвтрүүлсэн бөгөөд энэ нь олон хэлхээнд нэгэн зэрэг хуваалцсан (унших) түгжээг барих боломжийг олгодог синхрончлолын команд юм. Энэ нь орчин үеийн 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()-аар олж авсан; Олон хэлхээ үүнийг нэгэн зэрэг барьж чаддаг тул нэгэн зэрэг уншихад тохиромжтой. - Онцгой (бичих) түгжээ —
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
анги тохиргооны бүртгэл {
хувирах 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->second: "";
}
// Бичих зам: онцгой хандалт шаардлагатай
хүчингүй багц(const std::string& key, const std::string& val) {
std :: өвөрмөц_түгжээ (mtx_); // онцгой түгжээ — бүх уншигчдыг блоклодог
өгөгдөл_[түлхүүр] = 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-тай шууд тохирохгүй. Хэрэв та хуваалцсан мутекс барьж байхдаа нөхцөлийг хүлээх шаардлагатай бол std::shared_lock-тай хослуулсан std::shared_mutex зэрэг BasicLockable төрлийн аль ч төрөлтэй ажилладаг std::condition_variable_any-г ашиглаарай.
Би std::shared_mutex ашиглах болгондоо сэтгэгдэл нэмэх ёстой юу?
Хамгийн багаар бодоход мутексийн мэдэгдэлд тайлбар бичиж, ямар өгөгдөл хамгаалж, ямар хувьсагчийг хадгалж байгааг тайлбарлана уу. Түгжих сайт бүр дээр яагаад хуваалцсан болон онцгой хандалтыг сонгосон тухай товч тайлбар нь код хянагч болон ирээдүйн засварлагчдад чухал ач холбогдолтой юм. Зэрэгцээ алдаа нь олшрох, засахад хамгийн хэцүү байдаг тул тодорхой, нарийн тайлбарт оруулсан хөрөнгө оруулалт олон дахин ногдол ашиг өгдөг.
Цогц системийг удирдах нь C++ код эсвэл бүхэл бүтэн бизнесийн үйл ажиллагаа байхаас үл хамааран зөв хэрэгсэл, тодорхой бүтэц шаарддаг. Mewayz нь 138,000 гаруй хэрэглэгчдийн итгэлийг хүлээсэн 207 модуль бүхий бизнесийн үйлдлийн систем бөгөөд маркетинг, CRM, цахим худалдаа, аналитик болон бусад зүйлд ижил төстэй ойлголтыг нэг платформ дээр сард 19 доллараас эхэлдэг. Олон арван салангид хэрэгслүүдтэй жонглёрдохоо больж, сайн боловсруулсан програм хангамжийн нарийвчлалтайгаар бизнесээ эхлүүлээрэй. Өнөөдөр app.mewayz.com дээрээс Mewayz-г туршиж үзээд нэгдсэн систем танай багийн ажлын арга барилыг хэрхэн өөрчилж байгааг хараарай.
ногдол ашиг өгдөг.Try Mewayz Free
All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.
Get more articles like this
Weekly business tips and product updates. Free forever.
You're subscribed!
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 →Related articles
Hacker News
POSSE – Publish on your Own Site, Syndicate Elsewhere
Mar 23, 2026
Hacker News
Show HN: The King Wen Permutation: [52, 10, 2]
Mar 23, 2026
Hacker News
White-Collar AI Apocalypse Narrative Is Just Another Bullshit
Mar 23, 2026
Hacker News
Plane and ground vehicle collide at New York's LaGuardia airport halting flights
Mar 23, 2026
Hacker News
AI Proteomics Competition 2026 – $13K Prize, Internships and Compute Support
Mar 23, 2026
Hacker News
GoGoGrandparent (YC S16) is hiring Back end Engineers
Mar 23, 2026
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