Hacker News

Ukuqonda i-Std:Shared_mutex kusuka ku-C++17

Amazwana

6 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Ukuqonda okuthi std::shared_mutex kusuka ku-C++17

I-

std::shared_mutex, eyethulwe ku-C++17, iyisiqalisi sokuvumelanisa esivumela imicu eminingi ukuthi ngesikhathi esisodwa ibambe izingidi ezabelwe (funda) kuyilapho iqinisekisa ukufinyelela okukhethekile kwemisebenzi yokubhala. Ixazulula enye yezinselele ezivame kakhulu zokusebenzisana ku-C++ yesimanje ngokunikeza onjiniyela indlela ehlanzekile, evamile yokusebenzisa ukukhiya kombhali womfundi ngaphandle kokufinyelela kumalabhulali ezinkampani zangaphandle noma ama-API aqondene nenkundla ethile.

Iyini Kahle I-std::shared_mutex futhi Kungani Yengezwe ku-C++17?

Ngaphambi kwe-C++17, onjiniyela ababedinga i-semantics yombhali womfundi kwakudingeka bathembele kuzixazululo eziqondene nenkundla efana ne-pthread_rwlock_t kumasistimu we-POSIX noma SRWLOCK ku-Windows, noma bazosebenzisa amalabhulali ezinkampani zangaphandle njenge-Boost. Ikomidi elijwayelekile le-C++17 libone lesi sikhala futhi lethula std::shared_mutex kunhlokweni ukuze libhekane nalo ngqo.

Umbono owumongo uqondile: ezinhlelweni eziningi zomhlaba wangempela, idatha ifundwa kaningi kunalokho ebhalwayo. I-std::mutex ejwayelekile ihlanganisa konke ukufinyelela — ifundeka kuhlanganisiwe — okudala imigoqo engadingekile. std::shared_mutex iphakamisa lowo mkhawulo ngokuhlukanisa phakathi kwezindlela ezimbili zokukhiya:

  • Ukhiye owabiwe (ofundwayo) — utholwe nge-lock_shared(); imicu eminingi ingabamba lokhu ngesikhathi esisodwa, okuyenza ilungele ukufundwa ngasikhathi sinye.
  • Isikhiya (sokubhala) esikhethekile — sitholwe nge-lock(); Uchungechunge olulodwa kuphela olungabamba lokhu ngesikhathi, futhi awekho amalokhi okwabelwana ngawo avunyelwe ngenkathi ebanjwa.
  • std::shared_lock — isembozo se-RAII esibiza lock_shared() ekwakheni kanye unlock_shared() ekubhujisweni, ukuvimbela ukuvuza kwezinsiza.
  • std::unique_lock / std::lock_guard — isetshenziswa ngemodi ekhethekile, iqinisekisa ukuthi imisebenzi yokubhala ivikelwe ngokugcwele futhi iphephe ngokuhlukile.

Lo mklamo wemodi ekabili wenza i-std::shared_mutex ilingane ngokwemvelo ezimweni ezifana nezinqolobane, ukubhaliswa kokucushwa, nanoma yisiphi isakhiwo sedatha lapho ukufundwa kubusa umthwalo womsebenzi.

Uyisebenzisa kanjani i-std::shared_mutex kuKhodi Yangempela Ngamazwana?

Amazwana kukhodi asebenzisa i-std::shared_mutex abaluleke kakhulu ngoba ukuqondana kwe-concurrency kudume kanzima ukucabanga ngakho. Amazwana abekwe kahle acacisa kungani uhlobo oluthile lokukhiya lukhethiwe, okunciphisa kakhulu ingcuphe yokuthi abagcini besikhathi esizayo balethe imijaho yedatha ngephutha. Nansi iphethini evamile:

#faka 
#faka 
#faka 

class ConfigRegistry {
    std::shared_mutex mtx_; // ivikela imephu engezansi
    std::unordered_map data_;

esidlangalaleni:
    // Indlela yokufunda: izintambo eziningi zingabiza lokhu kanye kanye
    std::string get(const std::string& key) const {
        std::shared_lock lock(mtx_); // ukukhiya okwabiwe — kuphephile ukufundwa ngesikhathi esisodwa
        auto it = idatha_.find(key);
        yibuyisele != idatha_.end() ? it->yesibili : "";
    }

    // Indlela yokubhala: ukufinyelela okukhethekile kuyadingeka
    isethi engenalutho (const std::string& key, const std::string&val) {
        std::unique_lock lock(mtx_); // Ilokhi ekhethekile - ivimba bonke abafundi
        idatha_[ukhiye] = ival;
    }
};

Qaphela ukuthi amazwana ayichaza kanjani inhloso engemuva kwenketho ngayinye yokukhiya esikhundleni sokuphinda nje lokho okwenziwa ikhodi. Leli izinga legolide: amazwana kufanele aphendule kungani, hhayi yini. Igama elingukhiye elishintshekayo ku-mutex livumela i-get() ukuthi imenyezelwe const kuyilapho isakwazi ukukhiya, iphethini evamile ne-idiomatic.

Imininingwane Ebalulekile: Sebenzisa njalo izigodi zokukhiya ze-RAII (std::shared_lock, std::unique_lock) ne-std::shared_mutex — ungalokothi ushayele u-lock() kanye vula() ngokwenza. Ukukhiya mathupha lapho kukhona okuhlukile kuyindlela eqinisekisiwe eya ku-deadlock kanye nokuziphatha okungachazwanga.

Iziphi Izingibe Ezivamile Uma Usebenza ne-std::shared_mutex?

Ngisho namazwana acacile nezinhloso ezinhle, i-std::shared_mutex inezicupho ezicashile ezikhuphula onjiniyela abanolwazi. Okuyingozi kakhulu ukuthuthukisa ukukhiya: ayikho indlela eyakhelwe ngaphakathi yokuthuthukisa ukukhiya okwabelwana ngakho ukuze kube ukhiye okhethekile ngaphandle kokuwukhulula kuqala. Ukuzama ukwenza kanjalo ngaphandle kokukhulula kudala i-deadlock esheshayo ngoba intambo ibamba ilokhi eyabiwe ngenkathi ilinde ukukhiya okukhethekile okungasoze kwanikezwa inqobo nje uma kukhona noma iyiphi ingidi eyabelwe ikhona - kuhlanganise nalena eyibambile.

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

Elinye iphutha elivamile ukuvikela ubumbudumbudu obungalungile. Onjiniyela kwesinye isikhathi bakhiya banzi kakhulu, behlula inhloso yephethini yombhali womfundi, noma kancane, okushiya amawindi lapho okuguquguqukayo kwephulwa khona phakathi kokutholwa kokukhiya okubili okuhlukene. Amazwana achaza okungaguquguquki okuvikelwayo, kunokuba nje kukhiywe okuhlukile, kusiza amaqembu ukuthi acabange ngokunemba phakathi nokubuyekezwa kwekhodi.

Ukusebenza nakho kungakumangaza. Kumasistimu okubangisana kakhulu nababhali abaningi, i-std::shared_mutex ingase yenze kabi kakhulu kune-std::mutex esobala ngenxa yokugcinwa kwamabhuku okwengeziwe. Hlala uphrofayili ngaphambi kokuthatha ukuthi ukukhiya kombhali womfundi kuwukuwina okuphelele.

Iqhathaniseka kanjani ne-std::shared_mutex ne-std::mutex nezinye ezinye izindlela?

I-

std::mutex ilula, iyashesha ukuyithola uma umbango uphansi, futhi kufanelekile uma ukufunda nokubhala kwenzeka cishe ngokulingana. I-std::shared_mutex iyakhanya uma ifundwa kakhulu kunenombolo ebhalwayo — isilinganiso esingu-10:1 noma ngaphezulu kuwumthetho ophusile wesithupha ngaphambi kokucabangela ukushintsha.

I-

C++14 yethule i-std::shared_timed_mutex, enezela i-try_lock_shared_for() kanye ne-try_lock_shared_until() ngemizamo enesikhathi. I-std::shared_mutex ka-C++17 yehlisa ukwahluka okunesikhathi ukuze kusetshenziswe kancane. Uma udinga ukukhiya okunesikhathi endleleni eyabiwe, std::shared_timed_mutex ihlala ikhona futhi zombili izinhlobo zisezingeni eligcwele.

Ngezinye izindlela ezingakhiyiwe, i-std::atomic kuhlanganiswe nokuhleleka kahle kwememori kwesinye isikhathi kungashintsha i-mutex kumafulegi alula noma izinto zokubala, kodwa ezakhiweni zedatha eziyinkimbinkimbi, i-std::shared_mutex ihlala iyisixazululo esifundeka kakhulu nesilondolozekayo kulabhulali evamile.

Imibuzo Evame Ukubuzwa

Ingabe i-std::shared_mutex ingabangela indlala?

Yebo, ingakwazi. Uma abanikazi besikhiya esihlanganyelwe abasha beqhubeka nokufika ngokuqhubekayo, ocela ukukhiya okukhethekile angase alinde unomphela — inkinga yakudala yendlala yombhali. Izinga le-C++ aligunyazi inqubomgomo ethile yobulungisa, ngakho ukuziphatha kuncike ekusetshenzisweni. Empeleni, ukusetshenziswa okuningi okujwayelekile komtapo wolwazi kubeka phambili izingidi ezilindile ezikhethekile uma sezikulayini, kodwa kufanele uqinisekise lokhu kuchungechunge lwakho lwamathuluzi kanye nenkundla uma indlala iyinkinga ekukhiqizeni.

Ingabe i-std::shared_mutex iphephile ukusebenzisa ne-std::condition_variable?

I-

std::condition_variable idinga std::unique_lock, ngakho ayihambelani ngokuqondile ne-std::shared_mutex. Uma udinga ukulinda kumbandela ngenkathi ubambe i-mutex eyabelwe, sebenzisa i-std::condition_variable_any, esebenza nanoma yiluphi uhlobo oluyisisekeloLockable, okuhlanganisa i-std::shared_mutex ebhangqwe ne-std::shared_lock.

Ingabe kufanele ngengeze amazwana njalo uma ngisebenzisa i-std::shared_mutex?

Okungenani, beka amazwana ngesimemezelo se-mutex ukuze uchaze ukuthi iyiphi idatha eyivikelayo kanye nokushintshashintshayo eyigcinayo. Esayithini ngayinye yokukhiya, amazwana amafushane achaza ukuthi kungani kukhethwe ukufinyelela okwabelwanayo okukhethekile kwengeza inani elibalulekile kubabuyekezi bekhodi nabagcini besikhathi esizayo. Izimbungulu ze-Concurrency ziphakathi kwezinto okunzima kakhulu ukuzikhiqiza futhi uzilungise, ngakho ukutshalwa kwezimali emazwaneni acacile nanembe kunikeza izinzuzo izikhathi eziningi.


Ukuphatha amasistimu ayinkimbinkimbi — kungakhathaliseki ukuthi ikhodi ye-C++ efanayo noma umsebenzi wonke webhizinisi — kufuna amathuluzi afanele kanye nesakhiwo esicacile. I-Mewayz iyi-OS yebhizinisi enamamojuli angu-207 ethenjwa abasebenzisi abangaphezu kuka-138,000 ukuletha lokho kucaciseleka okufanayo ekukhangiseni, i-CRM, i-e-commerce, izibalo, nokuningi, konke kuplathifomu eyodwa eqala ku-$19 nje ngenyanga. Yeka ukuxova inqwaba yamathuluzi anqanyuliwe bese uqala ukuqhuba ibhizinisi lakho ngokunemba kwesofthiwe eklanywe kahle. Zama i-Mewayz namuhla ku-app.mewayz.com futhi ubone ukuthi isistimu ehlanganisiwe iyishintsha kanjani indlela iqembu lakho elisebenza ngayo.