Hacker News

Std:Shared_mutex gɔmesese tso C++17 me

Nyaŋuɖoɖowo

11 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Std::shared_mutex gɔmesese tso C++17

gbɔ

std::shared_mutex, si woto vɛ le C++17 me, nye wɔwɔ ɖekae ƒe gɔmedzenu si ɖea mɔ na ka geɖewo be woalé gaxɔ siwo woama (xexlẽ) ɖe asi le ɣeyiɣi ɖeka me esime wole ekpɔm be mɔɖeɖe tɔxɛ na nuŋɔŋlɔdɔwo. Ekpɔa ɣeyiɣi ɖeka me kuxi siwo bɔ wu le egbegbe C++ me la dometɔ ɖeka gbɔ to mɔnu dzadzɛ, si sɔ nana dɔwɔlawo be woatsɔ awɔ nuxlẽla-nuŋlɔla ƒe ʋuʋu ŋudɔ evɔ womaɖo ame etɔ̃lia ƒe agbalẽdzraɖoƒewo alo API tɔxɛwo gbɔ o.

Nuka Tututue Nye std::shared_mutex kple Nukatae Wotsɔe Kpe Ðe Eŋu Le C++17 Me?

Do ŋgɔ na C++17 la, ele be dɔwɔla siwo hiã nuxlẽla-nuŋlɔla ƒe gɔmesese naɖo ŋu ɖe mɔnu tɔxɛwo ƒe egbɔkpɔnuwo abe pthread_rwlock_t ŋu le POSIX ɖoɖowo dzi alo SRWLOCK le Windows dzi, ne menye nenema o la, woazã ame etɔ̃lia ƒe agbalẽdzraɖoƒewo abe Boost ene. C++17 ƒe dzidzenu kɔmiti de dzesi dometsotso sia eye wòto std::shared_mutex vɛ le tanya me be woakpɔ egbɔ tẽ.

Susua vevitɔa le tẽ: le xexeame ŋutɔŋutɔ ƒe ɖoɖowɔɖi geɖe me la, woxlẽa nyatakakawo zi geɖe wu alesi woŋlɔa wo. std::mutex ƒe ɖoɖo aɖe ɖoa mɔɖeɖewo katã ɖe ɖoɖo nu — nuxexlẽwo hã le eme — si wɔa aŋetu siwo mehiã o. std::shared_mutex ɖea mɔxexe ma ɖe dzi to vovototodedeameme le ʋuʋu ƒe mɔnu eve dome:

    ƒe nyawo
  • Woma (xlẽ) ʋɔtru — woxɔ to lock_shared() dzi; ka geɖewo ateŋu alé esia le ɣeyiɣi ɖeka me, si wɔe be wòsɔ nyuie na nuxexlẽ le ɣeyiɣi ɖeka me.
  • Exclusive (ŋlɔ) ƒe ʋɔtru — woxɔ to lock() dzi; ka ɖeka koe ateŋu alé esia le ɣeyiɣi ɖeka me, eye womeɖe mɔ ɖe gaƒoɖokui siwo woama ŋu esime wole elém o.
  • std::shared_lock — RAII ƒe agbalẽ xatsaxatsa si yɔa lock_shared() le xɔtutu me eye unlock_shared() le tsɔtsrɔ̃ me, si xea mɔ na nunɔamesiwo ƒe sisi.
  • std::unique_lock / std::lock_guard — wozãnɛ kple nɔnɔme tɔxɛ, si kpɔa egbɔ be nuŋɔŋlɔdɔwo le takpɔkpɔ bliboe eye wole dedie le vovototodedeameme me.
ƒe nyawo

Ame eve ƒe nɔnɔme sia na std::shared_mutex nye dzɔdzɔme si sɔ na nɔnɔmewo abe caches, ɖoɖowɔɖi ƒe nuŋlɔɖiwo, kple nyatakaka ƒe ɖoɖo ɖesiaɖe si me nuxexlẽwo ɖua dɔa dzi le.

Aleke Nàzã std::shared_mutex le Kɔda Nyateƒetɔ Me Kple Nyaŋuɖoɖowo?

Nyaŋuɖoɖo siwo le kɔda si zãa std::shared_mutex me xɔ asi ŋutɔ elabena concurrency logic xɔ ŋkɔ be esesẽ be woabu tame le eŋu. Nya siwo woda ɖe teƒe nyuiwo naa nukata wotia gaƒoɖokui ƒomevi aɖe koŋ me kɔ, si ɖea afɔku si le etsɔme belélawo be woato nyatakakawo ƒe duɖimekekewo vɛ le vo me dzi kpɔtɔna ŋutɔ. Kpɔɖeŋu si bɔ enye si:

#de  eme
#de  o
#de  eme

class ConfigRegistry { .
    std si trɔna::mamã_mutex mtx_; // kpɔa anyigbatata si le ete la ta
    std::map_si womeɖo ɖe ɖoɖo nu o data_;

dutoƒo:
    // Xlẽ mɔ: ka geɖewo ateŋu ayɔ esia le ɣeyiɣi ɖeka me
    std::ka xɔ (const std::ka& safui) const {
        std::mamã_ʋɔtru ʋɔtru (mtx_); // shared lock — dedie na nuxexlẽ le ɣeyiɣi ɖeka me
        auto it = data_.di (safui);
        trɔe != data_.end () ? it->evelia : "";
    } .

    // Ŋlɔ mɔ: mɔɖeɖe tɔxɛ hiã
    void set (const std::ka& safui, const std::ka& val) {
        std::unique_lock ʋɔtru (mtx_); // exclusive lock — xea mɔ na nuxlẽlawo katã
        data_ [safui] = val;
    } .
};

De dzesi alesi nyaŋuɖoɖoawo ɖe tameɖoɖo si le megbe na gaƒoɖokui tiatia ɖesiaɖe me tsɔ wu be woagbugbɔ agblɔ nusi kɔdasia wɔna ko. Esiae nye sikadzidzenu: ele be nyaŋuɖoɖowo naɖo nukata ŋu, ke menye nuka o. mutable nya vevi si le mutex la dzi ɖe mɔ be woaɖe gbeƒã get() be const esime wògate ŋu le ʋuʋu, si nye kpɔɖeŋu si bɔ eye wònye nyagbɔgblɔ.

ƒe nyawo

Nu Vevitɔwo ƒe Gɔmesese: Zã RAII ƒe ʋɔtrutiwo ɣesiaɣi (std::shared_lock, std::unique_lock) kple std::shared_mutex — mègayɔ lock() kple unlock() kple asi gbeɖe o. Asi ƒe ʋuʋu le nusiwo to vovo ƒe anyinɔnɔ me nye mɔ si ŋu kakaɖedzi le na mɔxexeɖedɔléle nu kple nuwɔna si womeɖe o.

ƒe nyawo

Nukae Nye Mɔ̃ Siwo Bɔ Ne Wole Dɔ Wɔm Kple std::shared_mutex?

Ne nya siwo me kɔ kple tameɖoɖo nyuiwo le asiwò gɔ̃ hã la, mɔ̃ siwo menya kpɔna dzea sii bɔbɔe o siwo klia nuteƒewɔla bibiwo le std::shared_mutex me. Afɔkutɔ kekeake enye lock upgrade: mɔnu aɖeke meli si wotu ɖe eme si dzi woato ado lock si woama ɖe lock tɔxɛ aɖe me evɔ womaɖe asi le eŋu gbã o. Agbagbadzedze be woawɔe evɔ womaɖe asi le eŋu o hea mɔxexeɖedɔa nu enumake elabena ka la léa gaƒoɖokui si woama esime wòle lalam na gaƒoɖokui tɔxɛ si womate ŋu ana gbeɖe o zi alesi gaƒoɖokui ɖesiaɖe si woama la li — si me esi wòlé ɖe asi hã le.

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

Vodada bubu si bɔ enye granularity si mesɔ o takpɔkpɔ. Ɣeaɖewoɣi la, dɔwɔlawo ƒoa ʋɔtrua wòkeke akpa, si ɖua taɖodzinu si le nuxlẽla-nuŋlɔla ƒe kpɔɖeŋua ŋu dzi, alo le kpuie akpa, eye wògblẽa fesre siwo dzi woda le invariants dzi le gaxɔgbalẽvi xɔxɔ vovovo eve dome. Nya siwo ɖɔ invariant being protected, tsɔ wu be woanye tɔtrɔ si wole ʋuʋum ko la, kpena ɖe ƒuƒoƒowo ŋu be woabu tame le dzɔdzɔenyenye ŋu le kɔdawo me toto me.

Dɔwɔwɔ hã ate ŋu awɔ nuku na wò. Le ɖoɖo siwo ŋu woʋlia nya le vevie kple nuŋlɔla geɖewo dzi la, std::shared_mutex ateŋu awɔ dɔ vɔ̃ɖi wu std::mutex dzro aɖe ŋutɔŋutɔ le agbalẽdzikpɔkpɔ ƒe gazazã bubu ta. Ɣesiaɣi la, profile hafi nàtsɔe be nuxlẽla-nuŋlɔla ƒe ʋuʋu nye net dziɖuɖu.

Aleke std::shared_mutex Tsɔe Sɔ Kple std::mutex kple Mɔnu Bubuwo?

std::mutex le bɔbɔe wu, exɔna kabakaba ne nyaʋiʋli le sue, eye wòsɔ ne nuxexlẽ kple nuŋɔŋlɔ dzɔ le ɣeyiɣi si sɔ kloe me. std::shared_mutex klẽna ne nuxexlẽwo sɔ gbɔ wu nuŋɔŋlɔwo ŋutɔ — 10:1 alo esi wu nenema ƒe xexlẽme nye se si sɔ hafi nàbu tɔtrɔa ŋu.

C++14 to std::shared_timed_mutex vɛ, si tsɔ try_lock_shared_for() kple try_lock_shared_until() kpe ɖe eŋu hena agbagbadzedze siwo woɖo ɖe ɣeyiɣi dzi. C++17 ƒe std::shared_mutex tsɔa ɣeyiɣi ƒe tɔtrɔwo ƒua gbe hena dɔwɔwɔ si le bɔbɔe wu. Ne èhiã ɣeyiɣi ƒe ʋuʋu le mɔ si woama dzi la, std::shared_timed_mutex gakpɔtɔ li eye ƒomevi eveawo siaa nye dzidzenu blibo.

Le mɔnu bubu siwo me gaƒoɖokui mele o gome la, std::atomic si wotsɔ kpe ɖe ŋkuɖodzinu ƒe ɖoɖowɔwɔ nyuie ŋu ateŋu axɔ ɖe mutex teƒe keŋkeŋ ɣeaɖewoɣi na aflaga bɔbɔewo alo xexlẽdzesiwo, gake le nyatakaka ƒe ɖoɖo sesẽwo gome la, std::shared_mutex gakpɔtɔ nye egbɔkpɔnu si woateŋu axlẽ wu eye woateŋu alé be nɛ wu le agbalẽdzraɖoƒe si woɖo ɖi.

Nyabiase Siwo Wobiana Enuenu

Ðe std::shared_mutex ate ŋu ahe dɔwuame vɛa?

Ẽ, ate ŋui. Ne shared-lock xɔla yeyewo yi edzi le vavam atraɖii la, exclusive-lock biala ateŋu alala ɣeyiɣi mavɔ — nuŋlɔla ƒe dɔwuame ƒe kuxi nyanyɛ aɖe. C++ ƒe dzidzenua mede se be woawɔ dzɔdzɔenyenye ƒe ɖoɖo aɖe koŋ o, eyata nuwɔna nɔ te ɖe edziwɔwɔ dzi. Le nuwɔna me la, agbalẽdzraɖoƒe ƒe dɔwɔwɔ deŋgɔ akpa gãtɔ tsɔa gaxɔ tɔxɛ siwo le lalam ɖoa nɔƒe gbãtɔ ne wonya ɖo fli me ko, gake ele be nàɖo kpe esia dzi na wò dɔwɔnu kple mɔ̃ tɔxɛ ne dɔwuame nye nusi ŋu wotsi dzi ɖo le ewɔwɔ me.

Ðe std::shared_mutex le dedie be woazã kple std::condition_variable?

std::condition_variable hiã std::unique_lock, eyata mewɔ ɖeka kple std::shared_mutex tẽ o. Ne ehiã be nàlala le nɔnɔme aɖe me esime nèle mutex si woama ɖe asi la, zã std::condition_variable_any, si wɔa dɔ kple BasicLockable ƒomevi ɖesiaɖe, si me std::shared_mutex si wotsɔ kpe ɖe std::shared_lock.

hã le

Ðe wòle be matsɔ nyawo akpe ɖe eŋu ɣesiaɣi si mazã std::shared_mutex?

Ne mede ɖeke o la, ƒo nu tso mutex ƒe gbeƒãɖeɖe ŋu be nàɖɔ nyatakaka siwo wòkpɔ ta na kple esiwo metrɔna o siwo wòléna ɖe te. Le ʋɔtrua ƒe teƒe ɖesiaɖe la, nya kpui aɖe si ɖe nusita wotia mɔɖeɖe si woama tsɔ wu esi woɖe mɔ na ɖeɖeko me la tsɔa asixɔxɔ gã aɖe kpena ɖe kɔpiwo me totolawo kple amesiwo adzra wo ɖo le etsɔme ŋu. Concurrency bugs le esiwo sesẽ wu be woagbugbɔ awɔ ahaɖɔ wo ɖo dome, eyata gadede nya siwo me kɔ, siwo sɔ pɛpɛpɛ me xea viɖe zi gbɔ zi geɖe.


ƒe nyawo

Nuɖoɖo sesẽwo dzi kpɔkpɔ — eɖanye C++ kɔpi si le ɣeyiɣi ɖeka me alo asitsatsa ƒe dɔwɔwɔ blibo o — bia dɔwɔnu nyuitɔwo kple ɖoɖo si me kɔ. Mewayz nye 207-module business OS si dzi ezãla siwo wu 138,000 ka ɖe edzi be wòahe eme kɔ ma ke vɛ na asitsatsa, CRM, e-commerce, numekuku, kple bubuwo, wo katã le mɔnu ɖeka dzi dzea egɔme tso $19 ko dzi ɣleti sia ɣleti. Dzudzɔ dɔwɔnu gbogbo aɖewo siwo me kadodo mele o zazã eye nàdze wò dɔwɔƒea dzi kpɔkpɔ gɔme kple kɔmpiutadziɖoɖo siwo ŋu wotrɔ asi le nyuie. Te Mewayz kpɔ egbea le app.mewayz.com eye nàkpɔ alesi ɖoɖo ɖeka trɔa alesi wò ƒuƒoƒoa wɔa dɔe.

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

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 →

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