Hacker News

Fahimtar Std:Shared_mutex daga C++17

Sharhi

9 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Fahimtar std::shared_mutex daga C++17

std ::shared_mutex, wanda aka gabatar a cikin C++17, shine farkon aiki tare wanda ke ba da damar zaren da yawa su riƙe makullai masu raba (karanta) lokaci guda yayin tabbatar da keɓancewar dama ga ayyukan rubutu. Yana magance ɗaya daga cikin ƙalubalen da aka saba da su a cikin C++ na zamani ta hanyar baiwa masu haɓakawa tsafta, daidaitaccen hanya don aiwatar da kulle-kulle-marubuta ba tare da isa ga ɗakunan karatu na ɓangare na uku ko takamaiman APIs ba.

Mene ne Daidai std ::shared_mutex kuma Me yasa Aka Ƙara shi a C++17?

Kafin C++17, masu haɓakawa waɗanda ke buƙatar ilimin tarukan rubutu-marubuta dole ne su dogara da takamaiman mafita kamar pthread_rwlock_t akan tsarin POSIX ko SRWLOCK akan Windows, ko kuma za su yi amfani da ɗakunan karatu na ɓangare na uku kamar Boost. Kwamitin ma'auni na C++17 ya gane wannan gibin kuma ya gabatar da std::shared_mutex a cikin header don magance shi kai tsaye.

Babban ra'ayin yana da sauƙi: a yawancin shirye-shiryen duniya, ana karanta bayanai fiye da yadda ake rubuta su. Daidaitaccen std:: mutex yana tsara duk damar shiga - an haɗa da karantawa - wanda ke haifar da ƙuƙumman da ba dole ba. std::shared_mutex yana ɗaga wannan ƙuntatawa ta banbance tsakanin hanyoyin kulle biyu:

  • Kulle (karanta) da aka raba - an samu ta hanyar lock_shared() ; zaren da yawa na iya riƙe wannan a lokaci guda, yana mai da shi manufa don karantawa lokaci guda.
  • kulle (rubuta) na musamman - an samo ta hanyar kulle() ; Zare ɗaya ne kawai zai iya riƙe wannan a lokaci ɗaya, kuma ba a yarda da makullin da aka raba yayin riƙe shi.
  • std ::shared_lock — abin rufewa na RAII wanda ke kiran lock_shared() akan ginin da unlock_shared() akan lalacewa, yana hana fitar albarkatu.
  • std ::unique_lock / std ::lock_guard - ana amfani da shi tare da keɓantaccen yanayin, tabbatar da cewa ayyukan rubuce-rubuce suna da cikakken kariya kuma ba su da aminci.

Wannan ƙirar yanayi biyu ta sa std::shared_mutex ya dace da yanayin yanayi kamar caches, rajistar rajista, da kowane tsarin bayanai inda karantawa ya mamaye aikin.

Yaya Kake Amfani da std ::shared_mutex a cikin Lambar Gaskiya Tare da Sharhi?

Bayanan da ke cikin lambar da ke amfani da std::shared_mutex suna da mahimmanci musamman saboda fahimtar ma'amala yana da wuyar fahimta. Abubuwan da aka sanya da kyau suna bayyaname yasa aka zaɓi wani nau'in kullewa, wanda ke rage haɗarin masu kiyayewa na gaba ba da gangan ba da gangan gabatar da tseren bayanai. Anan akwai tsari na yau da kullun:

#hade 
#hada da 
#hada da 

class ConfigRegistry {
    mutable std::shared_mutex mtx_; // yana kare taswirar da ke ƙasa
    std :: unordered_map  data_;

jama'a:
    // Karanta hanyar: zaren da yawa na iya kiran wannan a lokaci guda
    std :: kirtani samu (const std :: kirtani & key) const {
        std :: kulle kulle share (mtx_); // Makullin raba - amintaccen don karantawa lokaci guda
        auto shi = data_.find (key);
        mayar da shi != data_.end() ? it->na biyu :"";
    }

    // Rubuce hanya: keɓaɓɓen damar da ake buƙata
    saitin mara amfani (const std :: kirtani& key, const std :: kirtani & val) {
        std :: kulle_kulle (mtx_); // keɓaɓɓen kulle - toshe duk masu karatu
        data_[key] = val;
    }
}; 

Lura yadda sharhin ya bayyana manufar kowane zaɓi na kulle maimakon kawai sake maimaita abin da lambar ke yi. Wannan shine ma'aunin zinare: ya kamata sharhi ya amsa me yasa, ba mene. Maɓallin mai canzawa akan mutex yana ba da damar samu () don bayyana const yayin da har yanzu ana iya kullewa, tsari na gama-gari kuma na ban mamaki.

Maɓalli Maɓalli: Yi amfani da kullun makullin RAII (std :: sharing_lock, std ::kulle_kulle) tare da std::shared_mutex — kada a kira lock() da buɗe() da hannu. Kulle da hannu a gaban keɓantacce hanya ce mai garanti zuwa ga kulle-kulle da halayen da ba a bayyana ba.

Mene ne Matsalolin gama gari Lokacin Aiki Tare da std::shared_mutex?

Ko da bayyanannun tsokaci da kyakkyawar niyya, std::shared_mutex yana da tarkuna masu dabara da ke dagula ƙwararrun masu haɓakawa. Mafi haɗari shinehaɓaka kullewa: babu wata hanyar da aka gina ta don haɓaka makullin da aka raba zuwa keɓantaccen kulle ba tare da fitar da shi da farko ba. Ƙoƙarin yin haka ba tare da sakewa ba yana haifar da kulli nan take saboda zaren yana riƙe da makulli ɗaya yayin da yake jiran keɓantaccen makulli wanda ba za a taɓa samun shi ba matuƙar akwai makulli ɗaya - gami da wanda yake riƙe.

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

Wani kuskuren gama gari shine kare girman girman kuskure. Masu haɓakawa wani lokaci suna kulle sosai, suna cin nasara kan manufar tsarin marubucin mai karatu, ko kuma ƙunci, suna barin tagogi inda aka keta bambance-bambance tsakanin saye na kulle daban daban. Bayanin da ke bayyana saɓanin da ake karewa, maimakon madaidaicin da ake kulle, yana taimaka wa ƙungiyoyi su yi tunani game da daidaito yayin nazarin lamba.

Ayyuka kuma na iya ba ku mamaki. A kan tsarin da ake jayayya tare da marubuta da yawa, std::shared_mutex na iya yin muni fiye da a sarari std:: mutex saboda ƙarin ajiyar kuɗi. Koyaushe bayanin martaba kafin a ɗauka cewa kulle marubuci-marubuta cin nasara ne.

Ta yaya std ::shared_mutex yake Kwatanta da std ::mutex da sauran Madadin?

std::mutex ya fi sauƙi, sauri don samun lokacin da jayayya ta yi ƙasa, kuma ya dace lokacin karantawa da rubutu suna faruwa a kusan mitar daidai. std::shared_mutex yana haskakawa lokacin da aka karanta fiye da adadin da aka rubuta - adadin 10:1 ko mafi girma shine ƙa'idar babban yatsa mai ma'ana kafin la'akari da sauyawa.

C++14 ya ƙaddamar da std::shared_timed_mutex, wanda ya ƙara try_lock_shared_for() da try_lock_shared_har () don ƙoƙarce-ƙoƙarce. C++17's std::shared_mutex yana sauke bambance-bambancen lokaci don aiwatarwa mai sauƙi. Idan kuna buƙatar kulle lokaci akan hanyar da aka raba, std::shared_timed_mutex ya kasance yana nan kuma nau'ikan biyu sun cika daidai.

Don hanyoyin da ba a kulle ba, std :: atomic haɗe tare da yin oda a hankali na ƙwaƙwalwar ajiya wani lokaci na iya maye gurbin mutex gaba ɗaya don tutoci masu sauƙi ko ƙididdiga, amma don tsarin tsarin bayanai masu rikitarwa, std::shared_mutex ya kasance mafi kyawun karantawa da kiyayewa a cikin daidaitaccen ɗakin karatu.

Tambayoyin da ake yawan yi

Shin std::shared_mutex zai iya haifar da yunwa?

I, yana iya. Idan sabbin masu riƙon kulle-kulle suna ci gaba da zuwa ci gaba, mai buƙatun kulle-kulle na iya jira har abada - matsala ta marubucina al'ada. Ma'auni na C++ baya ba da umarnin takamaiman manufar adalci, don haka hali ya dogara da aiwatarwa. A aikace, mafi yawan daidaitattun aiwatar da laburare suna ba da fifiko ga makullai na keɓancewa da zarar an yi layi, amma ya kamata ku tabbatar da wannan don takamaiman kayan aikinku da dandamali idan yunwa ta damu da samarwa.

Shin std::shared_mutex yana da lafiya don amfani tare da std ::condition_variable?

std ::condition_variable yana buƙatar std :: keɓaɓɓen kulle , don haka bai dace kai tsaye da std::shared_mutex ba. Idan kana buƙatar jira a kan wani yanayi yayin da kake riƙe da abin da aka raba, yi amfani da std ::condition_variable_ any, wanda ke aiki tare da kowane nau'in BasicLockable, gami da std::shared_mutex haɗe tare da std::shared_lock.

Shin zan ƙara sharhi duk lokacin da na yi amfani da std::shared_mutex?

Aƙalla, yi sharhi da bayanin ɓangarorin don bayyana menene bayanan da yake karewa da kuma saɓanin da yake kiyayewa. A kowane rukunin yanar gizo na kulle, taƙaitaccen bayani da ke bayanin dalilin da yasa aka zaɓi zaɓi na keɓancewa tare da keɓancewar dama yana ƙara ƙima ga masu bitar lambar da masu kiyayewa na gaba. Kuskuren kwatankwacin kuɗi suna daga cikin mafi wahalar haɓakawa da gyarawa, don haka saka hannun jari a bayyane, madaidaicin sharhi yana biyan riba sau da yawa.


Sarrafar da hadaddun tsarin - ko lambar C++ na lokaci ɗaya ko duk wani aiki na kasuwanci - yana buƙatar ingantattun kayan aikin da ingantaccen tsari. Mewayz shine tsarin kasuwanci na 207-module OS wanda aka amince da sama da masu amfani da 138,000 don kawo wannan fayyace iri ɗaya ga tallace-tallace, CRM, kasuwancin e-commerce, nazari, da ƙari, duk a cikin dandamali ɗaya yana farawa daga $19 kawai kowane wata. Dakatar da juggling ɗin kayan aikin da aka cire da yawa kuma fara gudanar da kasuwancin ku tare da madaidaicin ingantaccen software. A gwada Mewayz yau a app.mewayz.com don ganin yadda tsarin haɗin kai ke canza yadda ƙungiyar ku ke aiki.