C++ 17-dən Std:Shared_mutex-i başa düşmək
Şərhlər
Mewayz Team
Editorial Team
C++17-dən std::shared_mutex-i anlamaq
C++ 17-də təqdim edilənstd::shared_mutex, yazma əməliyyatları üçün eksklüziv girişi təmin etməklə yanaşı, birdən çox mövzuya eyni vaxtda paylaşılan (oxu) kilidləri saxlamağa imkan verən sinxronizasiya primitividir. O, tərtibatçılara üçüncü tərəf kitabxanalarına və ya platformaya xas API-lərə müraciət etmədən oxucu-yazıçı kilidini həyata keçirmək üçün təmiz, standart üsul verməklə müasir C++-da ən çox rast gəlinən paralellik problemlərindən birini həll edir.
std::shared_mutex nədir və niyə C++17-də əlavə edilib?
C++17-dən əvvəl oxucu-yazıçı semantikasına ehtiyacı olan tərtibatçılar POSIX sistemlərində pthread_rwlock_t və ya Windows-da SRWLOCK kimi platformaya xas həllərdən istifadə etməli idilər, əks halda Boost kimi üçüncü tərəf kitabxanalarından istifadə edərdilər. C++17 standart komitəsi bu boşluğu tanıdı və onu birbaşa həll etmək üçün std::shared_mutex-u başlığında təqdim etdi.
Əsas ideya sadədir: bir çox real proqramlarda məlumatlar yazıldığından daha tez-tez oxunur. Standart std::mutex bütün girişi seriallaşdırır - daxil olan oxuyurlar - bu da lazımsız darboğazlar yaradır. std::shared_mutex iki kilidləmə rejimi arasında fərq qoyaraq həmin məhdudiyyəti qaldırır:
- Paylaşılan (oxu) kilidi —
lock_shared()vasitəsilə əldə edilir; bir neçə başlıq bunu eyni vaxtda saxlaya bilər, bu da onu paralel oxumaq üçün ideal edir. - Eksklüziv (yazma) kilidi —
lock()vasitəsilə əldə edilir; bunu eyni anda yalnız bir başlıq saxlaya bilər və saxlanıldığı müddətdə heç bir paylaşılan kilidə icazə verilmir. - std::shared_lock — tikinti zamanı
lock_shared()və məhv edildikdəunlock_shared()çağıran, resurs sızmasının qarşısını alan RAII paketi. - std::unique_lock / std::lock_guard — eksklüziv rejimlə istifadə olunur, yazma əməliyyatlarının tam qorunduğunu və istisnalar üçün təhlükəsiz olmasını təmin edir.
Bu ikili rejimli dizayn std::shared_mutex-ni keşlər, konfiqurasiya reyestrləri və iş yükündə oxuların üstünlük təşkil etdiyi istənilən məlumat strukturu kimi ssenarilər üçün təbii uyğunluq halına gətirir.
Şərhlərlə Real Kodda std::shared_mutex-dən necə istifadə edirsiniz?
Kodda std::shared_mutex istifadə edən şərhlər xüsusilə dəyərlidir, çünki paralellik məntiqi haqqında düşünmək çox çətindir. Yaxşı yerləşdirilmiş şərhlər niyə xüsusi kilid növünün seçildiyini aydınlaşdırır ki, bu da gələcək qoruyucuların təsadüfən məlumat yarışlarını təqdim etməsi riskini kəskin şəkildə azaldır. Budur tipik nümunə:
#include
#daxil edin
#include
class ConfigRegistry {
dəyişkən std::shared_mutex mtx_; // aşağıdakı xəritəni qoruyur
std::unordered_map data_;
ictimai:
// Oxuma yolu: birdən çox başlıq bunu eyni vaxtda çağıra bilər
std::string get(const std::string& key) const {
std::shared_lock lock(mtx_); // paylaşılan kilid — paralel oxumaq üçün təhlükəsizdir
auto it = data_.find(açar);
onu qaytarın!= data_.end() ? it->ikinci: "";
}
// Yazma yolu: eksklüziv giriş tələb olunur
boş dəst(const std::string& key, const std::string& val) {
std::unique_lock lock(mtx_); // eksklüziv kilid — bütün oxucuları bloklayır
data_[açar] = val;
}
};
Şərhlərin kodun nə etdiyini təkrarlamaqdansa, hər bir kilid seçiminin arxasındakı niyyəti necə izah etdiyinə diqqət yetirin. Bu qızıl standartdır: şərhlər nə yox, niyə cavab verməlidir. Muteksdəki mutable açar sözü get()-a const elan edilməsinə imkan verir, eyni zamanda ümumi və idiomatik modeldir.
Key Insight: Həmişə RAII kilid sarğılarından (
std::shared_lock,std::unique_lock)std::shared_mutexilə istifadə edin - heç vaxtlock()vəlock()-a əl ilə zəng etməyin. İstisnalar olduqda əl ilə kilidləmə dalana və qeyri-müəyyən davranışa aparan zəmanətli yoldur.
std::shared_mutex ilə işləyərkən ümumi tələlər nələrdir?
Aydın şərhlər və xoş niyyətlər olsa belə, std::shared_mutex təcrübəli tərtibatçıları incidən incə tələlərə malikdir. Ən təhlükəlisi kilid yeniləməsidir: paylaşılan kilidi əvvəlcə buraxmadan eksklüziv kilidə təkmilləşdirməyin daxili yolu yoxdur. Sərbəst buraxmadan bunu etməyə cəhd etmək ani blokada yaradır, çünki başlıq hər hansı paylaşılan kilid mövcud olduğu müddətdə heç vaxt verilməyəcək eksklüziv kilidi gözləyərkən paylaşılan kilidi saxlayır, o cümlədən onun saxladığı kilid.
💡 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 →Başqa bir ümumi səhv səhv dənəvərliyi qorumaqdır. Tərtibatçılar bəzən çox geniş şəkildə kilidləyirlər, oxucu-yazıçı modelinin məqsədini pozurlar və ya çox dar şəkildə iki ayrı kilid əldə edilməsi arasında invariantların pozulduğu pəncərələri tərk edirlər. Sadəcə kilidlənmiş dəyişənin deyil, qorunan dəyişməzliyi təsvir edən şərhlər komandalara kodun nəzərdən keçirilməsi zamanı düzgünlük barədə düşünməyə kömək edir.
Performans sizi təəccübləndirə bilər. Bir çox yazıçı ilə çox mübahisəli sistemlərdə std::shared_mutex əlavə mühasibat xərclərinə görə adi std::mutex-dan daha pis çıxış edə bilər. Oxucu-yazıçı kilidinin xalis qazanc olduğunu düşünməzdən əvvəl həmişə profilinizi yazın.
std::shared_mutex std::mutex və Digər Alternativlərlə Necə Müqayisə edir?
std::mutex daha sadədir, mübahisə aşağı olduqda daha sürətli əldə edilir və oxuma və yazma təxminən bərabər tezlikdə baş verdikdə uyğundur. std::shared_mutex oxunanların sayı yazılardan əhəmiyyətli dərəcədə çox olduqda parlayır — 10:1 və ya daha yüksək nisbət keçidi nəzərdən keçirməzdən əvvəl ağlabatan əsas qaydadır.
C++14, vaxtlı cəhdlər üçün try_lock_shared_for() və try_lock_shared_until() əlavə edən std::shared_timed_mutex təqdim etdi. C++17-nin std::shared_mutex daha sadə tətbiq üçün vaxt təyin edilmiş variantlarını azaldır. Əgər paylaşılan yolda vaxtlı kilidləmə lazımdırsa, std::shared_timed_mutex əlçatan qalır və hər iki növ tam standartdır.
Qilidsiz alternativlər üçün, ehtiyatlı yaddaş sifarişi ilə birlikdə std::atomic bəzən sadə bayraqlar və ya sayğaclar üçün mutexi tamamilə əvəz edə bilər, lakin mürəkkəb məlumat strukturları üçün std::shared_mutex standart kitabxanada ən oxunaqlı və saxlanıla bilən həll olaraq qalır.
Tez-tez verilən suallar
std::shared_mutex aclığa səbəb ola bilərmi?
Bəli, ola bilər. Yeni paylaşılan kilid sahibləri davamlı olaraq gəlməyə davam edərsə, eksklüziv kilid tələb edən şəxs qeyri-müəyyən müddətə gözləyə bilər - klassik yazıçı aclığı problemi. C++ standartı konkret ədalət siyasətini tələb etmir, ona görə də davranış icradan asılıdır. Təcrübədə, əksər standart kitabxana tətbiqləri növbəyə qoyulduqdan sonra gözlənilən eksklüziv kilidlərə üstünlük verir, lakin istehsalda aclıq narahatdırsa, bunu xüsusi alət silsiləsi və platformanız üçün yoxlamalısınız.
std::shared_mutex std::condition_variable ilə istifadə etmək təhlükəsizdirmi?
std::condition_variable std::unique_lock tələb edir, ona görə də std::shared_mutex ilə birbaşa uyğun gəlmir. Paylaşılan mutex saxlayarkən şərti gözləmək lazımdırsa, std::shared_lock ilə qoşalaşmış std::shared_mutex daxil olmaqla, istənilən BasicLockable növü ilə işləyən std::condition_variable_any istifadə edin.
Hər dəfə std::shared_mutex istifadə edəndə şərhlər əlavə etməliyəm?
Müteksin hansı məlumatları qoruduğunu və saxladığı dəyişməzliyi təsvir etmək üçün ən azı onun bəyannaməsini şərh edin. Hər bir kilidləmə saytında paylaşılan və eksklüziv girişin niyə seçildiyini izah edən qısa şərh kod rəyçiləri və gələcək xidmətçilər üçün əhəmiyyətli dəyər əlavə edir. Paralellik xətaları çoxaldılması və düzəltməsi ən çətin olanlardandır, ona görə də aydın, dəqiq şərhlərə investisiya dəfələrlə divident ödəyir.
Mürəkkəb sistemlərin idarə edilməsi – istər paralel C++ kodu, istərsə də bütün biznes əməliyyatı – düzgün alətlər və aydın struktur tələb edir. Mewayz ayda cəmi 19 dollardan başlayan qiymətlərlə bir platformada marketinq, CRM, e-ticarət, analitika və daha çox şeyə eyni aydınlığı gətirmək üçün 138.000-dən çox istifadəçinin etibar etdiyi 207 modullu biznes ƏS-dir. Onlarla əlaqəsi kəsilmiş alətlə hoqqabazlığı dayandırın və yaxşı dizayn edilmiş proqram təminatının dəqiqliyi ilə biznesinizi idarə etməyə başlayın. Bu gün app.mewayz.com saytında Mewayz-i sınayın və vahid sistemin komandanızın işini necə dəyişdirdiyinə baxın.
We use cookies to improve your experience and analyze site traffic. Cookie Policy