Hacker News

Kuelewa Std:Shared_mutex kutoka C++17

Maoni

8 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Kuelewa std::shared_mutex kutoka C++17

std::shared_mutex, iliyoletwa katika C++17, ni tangulizi ya ulandanishi inayoruhusu nyuzi nyingi kushikilia kwa wakati mmoja kufuli zilizoshirikiwa (kusoma) huku ikihakikisha ufikiaji wa kipekee kwa shughuli za uandishi. Husuluhisha mojawapo ya changamoto za upatanishi zinazojulikana zaidi katika C++ ya kisasa kwa kuwapa wasanidi programu njia safi, ya kawaida ya kutekeleza kipengele cha kufunga kisomaji-mwandishi bila kufikia maktaba za watu wengine au API maalum za jukwaa.

std::shared_mutex Ni Nini Hasa na Kwa Nini Iliongezwa kwenye C++17?

Kabla ya C++17, wasanidi programu ambao walihitaji semantiki za wasomaji walilazimika kutegemea masuluhisho mahususi ya jukwaa kama vile pthread_rwlock_t kwenye mifumo ya POSIX au SRWLOCK kwenye Windows, au wangetumia maktaba za watu wengine kama vile Boost. Kamati ya kawaida ya C++17 ilitambua pengo hili na kuanzisha std::shared_mutex katika kichwa cha ili kushughulikia moja kwa moja.

Wazo kuu ni moja kwa moja: katika programu nyingi za ulimwengu halisi, data inasomwa mara nyingi zaidi kuliko ilivyoandikwa. std::mutex ya kawaida husawazisha ufikiaji wote - kusoma kujumuishwa - ambayo husababisha vikwazo visivyo vya lazima. std::shared_mutex huondoa kizuizi hicho kwa kutofautisha kati ya njia mbili za kufunga:

  • Fungo lililoshirikiwa (kusoma) — linapatikana kupitia lock_shared(); nyuzi nyingi zinaweza kushikilia hii kwa wakati mmoja, na kuifanya kuwa bora kwa usomaji wa wakati mmoja.
  • Kufuli (kuandika) kipekee — kunapatikana kupitia kufuli(); nyuzi moja pekee ndiyo inaweza kushikilia hii kwa wakati mmoja, na hakuna kufuli zilizoshirikiwa zinazoruhusiwa wakati inashikiliwa.
  • std::shared_lock — kanga ya RAII inayoita lock_shared() kwenye ujenzi na unlock_shared() juu ya uharibifu, kuzuia uvujaji wa rasilimali.
  • std::unique_lock / std::lock_guard — hutumika kwa hali ya kipekee, kuhakikisha kuwa utendakazi wa uandishi unalindwa kikamilifu na ni salama kabisa.

Muundo huu wa hali-mbili hufanya std::shared_mutex kutoshea asili kwa matukio kama kache, sajili za usanidi na muundo wowote wa data ambapo usomaji hutawala mzigo wa kazi.

Unatumiaje std::shared_mutex katika Msimbo Halisi Pamoja na Maoni?

Maoni katika msimbo unaotumia std::shared_mutex ni muhimu sana kwa sababu mantiki ya upatanishi ni ngumu sana kufikiria. Maoni yaliyowekwa vyema hufafanua kwa nini aina fulani ya kufuli ilichaguliwa, ambayo hupunguza kwa kiasi kikubwa hatari ya watunzaji wa siku zijazo kuanzisha mbio za data kimakosa. Huu hapa ni muundo wa kawaida:

#pamoja na 
#jumuisha 
#pamoja na 

class ConfigRegistry {
    inayoweza kubadilika std::shared_mutex mtx_; // inalinda ramani iliyo hapa chini
    std::unordered_map data_;

umma:
    // Njia ya kusoma: nyuzi nyingi zinaweza kuita hii wakati huo huo
    std::string get(const std::string& key) const {
        std::shared_lock lock(mtx_); // kufuli iliyoshirikiwa - salama kwa usomaji wa wakati mmoja
        auto it = data_.find(key);
        irudishe != data_.end() ? it->pili : "";
    }

    // Njia ya kuandika: ufikiaji wa kipekee unahitajika
    seti tupu (const std::string& key, const std::string& val) {
        std::kufuli_kipekee (mtx_); // kufuli ya kipekee - huzuia wasomaji wote
        data_[ufunguo] = vali;
    }
};

Angalia jinsi maoni yanavyofafanua dhamira ya kila chaguo la kufuli badala ya kurudia tu kile ambacho msimbo hufanya. Hiki ndicho kiwango cha dhahabu: maoni yanapaswa kujibu kwa nini, si nini. Neno kuu la inayoweza kubadilishwa kwenye mutex huruhusu get() kutangazwa const huku ikiwa bado na uwezo wa kufunga, muundo wa kawaida na wa nahau.

Maarifa Muhimu: Tumia vifungashio vya RAII kila wakati (std::shared_lock, std::unique_lock) na std::shared_mutex — usiwahi kupiga simu lock() na fungua() wewe mwenyewe. Kufunga kwa mikono mbele ya vighairi ni njia iliyohakikishwa ya kufuli na tabia isiyobainishwa.

Je, ni Mitego gani ya Kawaida Unapofanya kazi na std::shared_mutex?

Hata kwa maoni yanayoeleweka na nia njema, std::shared_mutex ina mitego ya hila ambayo huwavutia watengenezaji wazoefu. Hatari zaidi ni uboreshaji wa kufuli: hakuna njia iliyojengewa ndani ya kuboresha kufuli iliyoshirikiwa hadi kufuli ya kipekee bila kuifungua kwanza. Kujaribu kufanya hivyo bila kuachilia huleta mkwamo wa papo hapo kwa sababu thread ina kufuli iliyoshirikiwa huku ikingoja kufuli ya kipekee ambayo haiwezi kutolewa mradi kufuli yoyote iliyoshirikiwa ipo - ikijumuisha ile iliyoshikilia.

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

Kosa lingine la kawaida ni kulinda uzito usio sahihi. Wasanidi programu wakati mwingine hufunga kwa upana sana, na kuharibu madhumuni ya muundo wa msomaji-mwandishi, au kwa finyu sana, na kuacha madirisha ambapo vibadala vinakiuka kati ya upataji wa kufuli mbili tofauti. Maoni ambayo yanaelezea kigeugeu kulindwa, badala ya kigezo pekee kufungwa, husaidia timu kusababu kuhusu usahihi wakati wa ukaguzi wa kanuni.

Utendaji pia unaweza kukushangaza. Kwenye mifumo inayogombana sana iliyo na waandishi wengi, std::shared_mutex inaweza kufanya vibaya zaidi kuliko std::mutex tupu kutokana na uwekaji hesabu wa ziada. Wasifu kila wakati kabla ya kudhani kuwafunga msomaji-mwandishi ni ushindi kamili.

Je, std::shared_mutex Inalinganishwaje na std::mutex na Njia Zingine Mbadala?

std::mutex ni rahisi zaidi, kwa haraka kupata wakati ugomvi ni mdogo, na inafaa wakati usomaji na kuandika hutokea kwa takriban masafa sawa. std::shared_mutex hung'aa inaposomwa kwa idadi kubwa kuliko idadi inayoandikwa - uwiano wa 10:1 au zaidi ni kanuni inayokubalika kabla ya kufikiria kubadili.

C++14 ilianzisha std::shared_timed_mutex, ambayo huongeza try_lock_shared_for() na try_lock_shared_until() kwa majaribio yaliyoratibiwa. std::shared_mutex ya C++17 hudondosha vibadala vilivyoratibiwa kwa ajili ya utekelezaji mdogo zaidi. Ikiwa unahitaji kufunga kwa muda kwenye njia inayoshirikiwa, std::shared_timed_mutex itaendelea kupatikana na aina zote mbili ni za kawaida kabisa.

Kwa mbadala zisizo na kufuli, std::atomic pamoja na upangaji kumbukumbu kwa uangalifu wakati mwingine zinaweza kuchukua nafasi ya bubu kwa bendera au vihesabio rahisi, lakini kwa miundo changamano ya data, std::shared_mutex inasalia kuwa suluhisho linalosomeka na kudumishwa zaidi katika maktaba ya kawaida.

Maswali Yanayoulizwa Sana

Je, std::shared_mutex inaweza kusababisha njaa?

Ndiyo, inaweza. Ikiwa vimiliki vipya vya kufuli vilivyoshirikiwa wataendelea kuwasili kila mara, mwombaji wa kufuli ya kipekee anaweza kusubiri kwa muda usiojulikana - tatizo la kawaida la mwandishi njaa. Kiwango cha C++ hakiamuru sera mahususi ya haki, kwa hivyo tabia inategemea utekelezaji. Kiutendaji, utekelezaji mwingi wa maktaba ya kawaida hutanguliza kufuli za kipekee zinazosubiri mara tu zimewekwa kwenye foleni, lakini unapaswa kuthibitisha hili kwa msururu wa zana na mfumo wako mahususi ikiwa njaa inasumbua katika uzalishaji.

Je std::shared_mutex ni salama kutumia na std::condition_variable?

std::condition_variable inahitaji std::unique_lock, kwa hivyo haioani moja kwa moja na std::shared_mutex. Iwapo unahitaji kusubiri kwa sharti ukiwa umeshikilia bubu iliyoshirikiwa, tumia std::condition_variable_any, ambayo inafanya kazi na aina yoyote ya BasicLockable, ikiwa ni pamoja na std::shared_mutex iliyooanishwa na std::shared_lock.

Je, niongeze maoni kila ninapotumia std::shared_mutex?

Kwa uchache, toa maoni kwa tamko la bubu ili kuelezea ni data gani inalinda na vibadala vinavyodumishwa. Katika kila tovuti ya kufuli, maoni mafupi yanayoeleza ni kwa nini ufikiaji wa pamoja dhidi ya ufikiaji wa kipekee ulichaguliwa huongeza thamani kubwa kwa wakaguzi wa misimbo na watunzaji wa siku zijazo. Hitilafu za kubadilisha fedha ni miongoni mwa matatizo magumu zaidi kuzaliana na kurekebisha, kwa hivyo uwekezaji katika maoni yaliyo wazi na sahihi hulipa faida mara nyingi zaidi.


Kudhibiti mifumo changamano — iwe misimbo ya C++ inayotumika wakati mmoja au uendeshaji mzima wa biashara — inahitaji zana zinazofaa na muundo wazi. Mewayz ni mfumo wa uendeshaji wa biashara wa moduli 207 unaoaminiwa na zaidi ya watumiaji 138,000 kuleta uwazi sawa kwa uuzaji, CRM, biashara ya mtandaoni, uchanganuzi, na zaidi, yote katika mfumo mmoja kuanzia $19 pekee kwa mwezi. Acha kushughulikia zana kadhaa ambazo hazijaunganishwa na anza kuendesha biashara yako kwa usahihi wa programu iliyoundwa vizuri. Jaribu Mewayz leo katika app.mewayz.com na uone jinsi mfumo uliounganishwa unavyobadilisha jinsi timu yako inavyofanya kazi.