Hacker News

Kumvetsetsa Std:Shared_mutex kuchokera ku C++17

Ndemanga

6 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Kumvetsetsa std::shared_mutex kuchokera ku C++17

std::shared_mutex, yoyambitsidwa mu C++17, ndiyoyamba yolumikizana yomwe imalola kuti ulusi wambiri ugwire maloko omwe amagawana (kuwerenga) panthawi imodzi ndikuwonetsetsa kuti pali mwayi wofikira pazolemba. Imathetsa vuto limodzi lodziwika bwino pakugwiritsa ntchito ndalama mu C++ yamakono popatsa opanga njira yoyera, yokhazikika yotsekera kutseka kwa owerenga popanda kufikira malaibulale ena kapena ma API a papulatifomu.

Kodi std::shared_mutex ndi Chiyani Kwenikweni Inawonjezedwa mu C++17?

C++17 isanakwane, omanga omwe amafunikira semantics ya owerenga-olemba amayenera kudalira mayankho achindunji monga pthread_rwlock_t pamakina a POSIX kapena SRWLOCK pa Windows, kapena amagwiritsa ntchito malaibulale a chipani chachitatu monga Boost. Komiti yokhazikika ya C++17 inazindikira kusiyana kumeneku ndipo inayambitsa std::shared_mutex pamutu kuti ithetseretu mwachindunji.

Lingaliro lalikulu ndilolunjika: m'mapulogalamu ambiri enieni, deta imawerengedwa mochuluka kuposa momwe imalembedwera. Mulingo wa std::mutex umasanjikiza zonse zomwe zingapezeke - zowerengedwa zikuphatikizidwa - zomwe zimapangitsa kuti pakhale zovuta zosafunikira. std::shared_mutex amakweza malirewo posiyanitsa mitundu iwiri yokhoma:

  • Loko logawana (werengani) — lopezedwa kudzera pa lock_shared(); ulusi wambiri ukhoza kugwira izi nthawi imodzi, zomwe zimapangitsa kuti zikhale zabwino kuti ziziwerengedwa nthawi imodzi.
  • Kutseka (kulemba) Kwapadera — kupezedwa kudzera pa lock(); ulusi umodzi wokha ungathe kugwira izi panthawi imodzi, ndipo palibe maloko ogawana omwe amaloledwa pamene akugwira.
  • std::shared_lock — chotchingira cha RAII chomwe chimayitana lock_shared() pomanga ndi unlock_shared() pakuwononga, kuteteza kutulutsa kwazinthu.
  • std::unique_lock / std::lock_guard — yogwiritsidwa ntchito m'njira yapaderadera, kuwonetsetsa kuti zolemba zili zotetezedwa mokwanira komanso zotetezedwa mwapadera.

Mapangidwe amitundu iwiriwa amapangitsa std::shared_mutex kuti igwirizane ndi zochitika ngati cache, kaundula wa kasinthidwe, ndi mtundu uliwonse wa data pomwe mawerengedwe amawongolera ntchito.

Mumagwiritsa Ntchito Motani std::shared_mutex mu Real Code Ndi Ndemanga?

Ndemanga m'makhode omwe amagwiritsa ntchito std::shared_mutex ndi ofunika kwambiri chifukwa malingaliro a concurrency ndi ovuta kuganiza. Ndemanga zoyikidwa bwino zimamveketsa chifukwamtundu wina wa loko unasankhidwa, zomwe zimachepetsa kwambiri chiopsezo cha osamalira mtsogolo mwangozi kuyambitsa mitundu ya data. Nayi njira yodziwika bwino:

#include 
#muphatikizepo 
# kuphatikiza 

kalasi ConfigRegistry {
    mutable std::shared_mutex mtx_; // imateteza mapu pansipa
    std::unordered_map data_;

anthu onse:
    // Werengani njira: ulusi wambiri ungatchule izi nthawi imodzi
    std ::string get (const std::string& key) const {
        std::shared_lock loko(mtx_); // loko yogawana - yotetezeka kuti iwerengedwe nthawi imodzi
        auto it = data_.find(kiyi);
        bwezerani != data_.end() ? it->yachiwiri : "";
    }

    // Lembani njira: kupeza kokha kumafunika
    void set (const std::string& key, const std::string& val) {
        std::unique_lock loko(mtx_); // loko kokha - kumatchinga owerenga onse
        data_[kiyi] = val;
    }
};

Zindikirani momwe ndemanga zimafotokozera cholinga cha loko iliyonse osati kungobwereza zomwe code imachita. Uwu ndiye muyezo wagolide: ndemanga ziyenera kuyankha chifukwa, osati chiyani. Mawu ofunikira a mutable pa mutex amalola get() kuti atchulidwe kuti consst ndikutha kutseka, njira yodziwika bwino komanso yofotokozera.

Key Insight: Gwiritsani ntchito zomanga zokhoma za RAII (std::shared_lock, std::unique_lock) ndi std::shared_mutex — osayimba lock() ndi tsegulani() pamanja. Kutsekera pamanja pamaso pa zosiyanitsa ndi njira yotsimikizirika yofikira patali ndi machitidwe osadziwika.

Kodi Miphuphu Yodziwika Ndi Chiyani Mukamagwira Ntchito ndi std::shared_mutex?

Ngakhale ndi ndemanga zomveka bwino komanso zolinga zabwino, std::shared_mutex ili ndi misampha yosadziwika bwino yomwe imakopa akatswiri odziwa zambiri. Choopsa kwambiri ndikukweza loko: palibe njira yowonjezera yopititsira patsogolo loko yogawana ku loko yokha popanda kuimasula poyamba. Kuyesera kutero popanda kumasula kumapangitsa kuti pakhale kutsekeka nthawi yomweyo chifukwa ulusi umakhala ndi loko yogawana kwinaku akudikirira loko yomwe singapatsidwe malinga ngati loko yogawana ilipo - kuphatikiza yomwe ikugwirizira.

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

Kulakwitsa kwina kofala ndikuteteza nyonga yolakwika. Madivelopa nthawi zina amatseka kwambiri, kusokoneza cholinga cha owerenga-olemba, kapena mochepera, kusiya mazenera pomwe zosintha zimaphwanyidwa pakati pa zogula ziwiri zosiyana za loko. Ndemanga zomwe zimafotokoza zosasinthika kutetezedwa, m'malo mongotsekedwa, magulu amathandizira kulingalira za kulondola pakuwunika ma code.

Kuchita bwino kungathenso kukudabwitsani. Pamakina omwe amakangana kwambiri ndi olemba ambiri, std::shared_mutex atha kuchita moyipa kwambiri kuposa std::mutex wamba chifukwa chosunga zambiri. Nthawi zonse mbiri musanaganize kuti kutseka kwa owerenga ndikupambana.

Kodi std::shared_mutex Imafananiza Bwanji ndi std::mutex ndi Njira Zina Zina?

std::mutex ndiyosavuta, yofulumira kupeza mikangano ikachepa, ndipo ndiyoyenera kuwerenga ndi kulemba kumachitika pafupipafupi. std::shared_mutex imawala mukawerenga mochulukira kuposa zolemba - chiŵerengero cha 10:1 kapena kupitilira apo ndi lamulo lomveka bwino musanaganizire zosintha.

C++14 yabweretsa std::shared_timed_mutex, yomwe imawonjezera try_lock_shared_for() ndi try_lock_shared_until() kuti muyese nthawi yake. C++17's std::shared_mutex imatsitsa masinthidwe anthawi yake kuti agwiritse ntchito mopepuka. Ngati mukufuna kutseka kwanthawi yake panjira yomwe mwagawana, std::shared_timed_mutex imakhalabe ndipo mitundu yonse iwiri ndi yokhazikika.

Pazinthu zina zopanda loko, std::atomic kuphatikiza ndi kuyitanitsa koyenera kukumbukira nthawi zina kumatha kulowetsa mutex pa mbendera kapena zowerengera zosavuta, koma pama data ovuta, std::shared_mutex ikadali yankho lowerengeka komanso losasinthika mu library yokhazikika.

Mafunso Ofunsidwa Kawirikawiri

Kodi std::shared_mutex ingayambitse njala?

Inde, zitha. Ngati zokhala ndi loko zogawana zimangobwera mosalekeza, wopempha loko angadikire mpaka kalekale — vuto lachikale lannjala ya wolemba. Muyezo wa C ++ sumalamula ndondomeko yeniyeni yachilungamo, kotero khalidwe limadalira kukhazikitsidwa. M'malo mwake, machitidwe ambiri a laibulale amaika patsogolo maloko omwe akudikirira pokhapokha atayikidwa pamzere, koma muyenera kutsimikizira izi pazida zanu zenizeni ndi nsanja ngati njala ikukhudzidwa.

Kodi std::shared_mutex ndi yotetezeka kugwiritsa ntchito ndi std::condition_variable?

std::condition_variable imafuna std::unique_lock, kotero siyogwirizana mwachindunji ndi std::shared_mutex. Ngati mukuyenera kudikirira pokhapokha mutagwira mutex wogawana nawo, gwiritsani ntchito std::condition_variable_any, yomwe imagwira ntchito ndi mtundu uliwonse wa BasicLockable, kuphatikiza std::shared_mutex wophatikizidwa ndi std::shared_lock.

Kodi ndiwonjezere ndemanga nthawi zonse ndikamagwiritsa ntchito std::shared_mutex?

Osachepera, perekani ndemanga pa chilengezo cha mutex kuti mufotokoze deta yomwe imateteza komanso zosasintha zomwe imasunga. Pamalo aliwonse otchinga, ndemanga yachidule yofotokoza chifukwa chake mwayi wogawana ndi wosankhidwa mwapadera udasankhidwa kumawonjezera phindu kwa owunikira ma code ndi osamalira mtsogolo. Concurrency nsikidzi ndi zina mwazovuta kwambiri kuchulukitsa ndi kukonza, kotero kuti ndalamazo mu ndemanga zomveka bwino, zolondola, zimapereka phindu kambirimbiri.


Kuwongolera machitidwe ovuta - kaya ma code C++ nthawi imodzi kapena bizinesi yonse - amafuna zida zoyenera ndi dongosolo lomveka bwino. Mewayzndi 207-module business OS yodalirika ndi ogwiritsa ntchito oposa 138,000 kuti abweretse kumveka komweku ku malonda, CRM, e-commerce, analytics, ndi zina, zonse mu nsanja imodzi kuyambira $19 yokha pamwezi. Lekani kunyengerera zida zambiri zolumikizidwa ndikuyamba kuyendetsa bizinesi yanu ndi mapulogalamu opangidwa bwino. Yeserani Mewayz lero pa app.mewayz.com ndikuwona momwe makina ogwirizana amasinthira momwe gulu lanu limagwirira ntchito.