Hacker News

Fêmkirina Std:Shared_mutex ji C++17

Comments

10 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Fêmkirina std::shared_mutex ji C++17

std::shared_mutex, ku di C++17-ê de hatî destnîşan kirin, seretayîyek hevdengkirinê ye ku dihêle çend kêşan bi hevdemî kilîdên parvekirî (xwendin) bigirin û di heman demê de gihîştina taybetî ji bo operasyonên nivîsandinê misoger dike. Ew yek ji kêşeyên hevedudanî yên herî gelemperî di C++-ya nûjen de çareser dike bi dayîna pêşdebiran rêgezek paqij û standard ji bo pêkanîna girtina xwendevan-nivîskar bêyî ku bigihîje pirtûkxaneyên partiya sêyemîn an API-yên taybetî yên platformê.

Bi rastî std::shared_mutex çi ye û çima di C++17 de hate zêdekirin?

Berî C++17, pêşdebirên ku hewcedariya wan bi semantîka xwendevan-nivîskar hebû diviyabû ku xwe bispêrin çareseriyên platform-taybet ên wekî pthread_rwlock_t li ser pergalên POSIX an SRWLOCK li ser Windows, an jî ew ê pirtûkxaneyên partiya sêyemîn ên wekî Boost bikar bînin. Komîteya standard a C++17 ev valahî nas kir û std::shared_mutex di sernavê de destnîşan kir da ku rasterast çareser bike.

Fikra bingehîn rasterast e: di gelek bernameyên cîhana rast de, dane ji ya ku têne nivîsandin pir pir caran têne xwendin. A standard std::mutex hemî gihîştinê rêz dike - dixwîne tê de - ku tengahiyên nehewce çêdike. std::shared_mutex bi ferqkirina du awayên girtinê, wê sînordariyê radike:

  • Girtina parvekirî (xwendin) — bi rêya lock_shared() ve hatî wergirtin; gelek kêşan dikarin vê yekê bi hev re bigirin, ku wê ji bo xwendina hevdemî îdeal e.
  • Lofta taybetî (binivîse) — bi lock() ve hatî wergirtin; tenê mijarek dikare vê yekê di yek carê de bigire, û dema ku tê girtin ti kilîdên hevbeş destûr nayên girtin.
  • std::shared_lock - pêçekek RAII ku di avakirinê de gazî lock_shared() dike û li ser hilweşandinê jî unlock_shared() vedibêje, ku rê li ber derçûna çavkaniyê digire.
  • std::unique_lock / std::lock_guard - bi moda taybetî ve tê bikar anîn, û piştrast dike ku operasyonên nivîsandinê bi tevahî parastî û ewledar in.

Ev sêwirana du-mode std::shared_mutex ji bo senaryoyên mîna cache, tomarên vesazkirinê, û her avahiyek daneyê ya ku xwendin li ser barê xebatê serdest e, guncanek xwezayî dike.

Hûn çawa std::shared_mutex di Koda Rastî de Bi Şîroveyan Bi kar tînin?

Şiroveyên di koda ku std::shared_mutex bikar tîne bi taybetî bi nirx in ji ber ku mantiqa hevedudanî ya bi navûdeng zehf dijwar e. Şîroveyên baş eşkere dikin çima celebek kilîtkirî ya taybetî hate hilbijartin, ku ev yek xetereya ku parêzvanên paşerojê bi xeletî pêşbaziyên daneyê destnîşan dikin bi rengek berbiçav kêm dike. Li vir nimûneyek tîpîk e:

#include 
#include 
#include 

class ConfigRegistry {
    mutable std::shared_mutex mtx_; // nexşeya jêrîn diparêze
    std::nexşeya_nesazkirî data_;

giştî:
    // Rêya xwendinê: dibe ku gelek mijarên hevdem vê bang bikin
    std:: string get (const std:: string & key) const {
        std::shared_lock lock(mtx_); // kilîtkirina hevbeş - ji bo xwendina hevdem ewle ye
        oto ew = data_.find(key);
        vegerîne != data_.end() ? it->duyem : "";
    }

    // Rêya nivîsandinê: gihandina taybetî hewce ye
    set vala (const std::string& key, const std::string& val) {
        std:: lock_unique_lock(mtx_); // kilîtkirina taybetî - hemî xwendevanan asteng dike
        data_[key] = val;
    }
};

Bala xwe bidinê ka şirove çawa niyeta li pişt her bijareya qeflê rave dike, ne ku tenê ji nûvekirina kodê çi dike. Ev standarda zêrîn e: şîrove divê bersiva çima bidin, ne çi. Peyva sereke ya guherbar ya li ser mutex dihêle ku get() were ragihandin const û hîn jî dikare were girtin, nimûneyek hevpar û biwêj.

Agahdariya sereke: Her tim pêçanên kilîtkirî yên RAII bikar bînin (std::shared_lock, std::unique_lock) bi std::shared_mutex - qet gazî lock() bi destan nekin () û . Girtina bi destan di hebûna îstisnayan de rêyek garantîkirî ye ku berbi xitimandin û tevgerên nediyar ve diçe.

Dema ku bi std::shared_mutex re dixebitin Xetereyên Hevpar Çi ne?

Tevî şîroveyên zelal û niyetên baş jî, std::shared_mutex xwedan xefikên nazik e ku pêşdebirên bi tecrûbe dixebitîne. Ya herî metirsîdar nûvekirina qeflê ye: Rêyek çêkirî tune ku meriv kilîtek hevpar berbi kilîtek taybetî were nûve kirin bêyî ku pêşî jê were berdan. Hewldana kirina vê yekê bêyî berdanê xitimandinek tavilê diafirîne ji ber ku mijar kilîtek hevpar digire dema ku li benda kilîtek taybetî ye ku heya ku kilîtek hevpar hebe - di nav de ya ku ew digire jî qet nayê dayîn.

💡 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 →

Çewtiyeke din a hevpar parastina granulariya çewt e. Pêşdebir carinan pir berfireh kilît dikin, armanca şêwaza xwendevan-nivîskar têk dibin, an jî pir teng, pencereyên ku guhêrbar di navbera du destkeftiyên kilîtkirî yên cihêreng de têne binpê kirin dihêlin. Şîroveyên ku guherbara ku tê parastin rave dikin, li şûna ku guhêrbar girtî be, alîkariya tîmê dikin ku di dema vekolîna kodê de rastdariyê bifikirin.

Performansa dikare we jî şaş bike. Li ser pergalên pir nakok ên ku bi gelek nivîskaran re hene, std::shared_mutex dibe ku bi rastî ji std::mutex ya sade xirabtir bimeşe ji ber sermaya zêde ya tomarkirinê. Berî ku girtina xwendevan-nivîskar serkeftinek netîce ye, her gav profîla xwe bikin.

Std::shared_mutex Bi std::mutex û Alternatîfên Din re Çawa Berawird Dike?

std::mutex hêsantir e, dema ku nakokî kêm e tê bidestxistin hêsantir e, û dema ku xwendin û nivîsandin bi frekansa hema hema wekhev pêk tên guncan e. std::shared_mutex dema ku xwendin bi girîngî ji hejmara nivîsandinê zêdetir be dibiriqe - rêjeyek 10:1 an jî bilindtir rêjeyek maqûl e ku berî ku meriv guheztinê bihesibîne.

C++14 std::shared_timed_mutex destnîşan kir, ku try_lock_shared_for() û try_lock_shared_until() ji bo hewildanên demkî zêde dike. C++17's std::shared_mutex guhertoyên demkî yên ji bo pêkanîna hêniktir davêje. Ger hewcedariya we bi girtina demkî ya li ser riya hevpar hebe, std::shared_timed_mutex berdest dimîne û her du celeb jî bi tevahî standard in.

Ji bo alternatîfên bê kilît, std::atomic tevî rêzkirina bîrê ya baldar carinan carinan dikare mutexek bi tevahî ji bo ala an jimarvanan biguhezîne, lê ji bo strukturên daneya tevlihev, std::shared_mutex di pirtûkxaneya standard de çareseriya herî xwendin û parastinê dimîne.

Pirsên Pir Pir tên Pirsîn

Gelo std::shared_mutex dikare bibe sedema birçîbûnê?

Belê, ew dikare. Ger xwediyên kilîtkirî yên nû bi domdarî digihîjin, dibe ku daxwazkarek kilîtkirî ya bêkêmasî li bendê bimîne - pirsgirêkek birçîbûna nivîskar ya klasîk. Standarda C++ polîtîkayek dadperwerî ya taybetî ferz nake, ji ber vê yekê tevger bi pêkanînê ve girêdayî ye. Di pratîkê de, piraniya pêkanînên pirtûkxaneyê yên standard pêşî li kilîdên bêkêmasî yên li bendê digirin gava ku ew werin rêz kirin, lê divê hûn vê yekê ji bo zincîra amûr û platforma xweya taybetî verast bikin ger birçîbûn di hilberînê de fikar be.

Gelo std::shared_mutex ewle ye ku bi std::condition_variable re were bikar anîn?

std::condition_variable std::unique_lock hewce dike, ji ber vê yekê ew rasterast bi std::shared_mutex re ne lihevhatî ye. Heke hûn hewce ne ku hûn li ser şertek bisekinin dema ku mutexek hevpar digirin, std::condition_variable_any bikar bînin, ku bi her celebek BasicLockable re dixebite, di nav de std::shared_mutex bi std::shared_lock re hevberkirî.

Ma ez her gava ku ez std::shared_mutex bikar tînim şîroveyan lê zêde bikim?

Bi kêmanî, danezana mutex şîrove bike da ku diyar bike ka kîjan daneyan diparêze û guhêrbarên ku ew diparêze. Li her malpera kilîtkirinê, şîroveyek kurt ku rave dike ka çima parvekirî li hember gihandina taybetî hate hilbijartin ji bo vekolerên kodê û parêzvanên pêşerojê nirxek girîng zêde dike. Çewtiyên hevdemiyê di nav yên herî dijwar de ne ku têne hilberandin û rastkirin, ji ber vê yekê veberhênana di şîroveyên zelal û rast de gelek caran berdêlan dide.


Birêvebirina pergalên tevlihev - çi koda C++ ya hevdemî be, çi tevayî operasyonek karsaziyê - amûrên rast û avahiyek zelal hewce dike. Mewayz OS-ya karsaziya 207-module ye ku ji hêla zêdetirî 138,000 bikarhêneran ve tê pêbawer kirin da ku heman zelaliyê bîne kirrûbirra, CRM, e-bazirganî, analîtîk, û hêj bêtir, hemî di yek platformê de ku mehê bi tenê 19 $ dest pê dike. Dev ji danûstendina bi dehan amûrên veqetandî berdin û bi rastbûna nermalava xweş sêwirandî karsaziya xwe bimeşînin. Îro Mewayz biceribîne li app.mewayz.com û bibînin ka pergalek yekgirtî awayê xebata tîmê we çawa diguherîne.