Hacker News

Deall Std:Shared_mutex o C++17

Sylwadau

8 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Deall std::shared_mutex o C++17

std::shared_mutex, a gyflwynwyd yn C++17, yn gyntefig cydamseru sy'n caniatáu i edafedd lluosog ddal cloeon a rennir (darllen) ar yr un pryd gan sicrhau mynediad unigryw ar gyfer gweithrediadau ysgrifennu. Mae'n datrys un o'r heriau arian cyfred mwyaf cyffredin yn C++ modern trwy roi ffordd lân, safonol i ddatblygwyr weithredu cloi darllenydd-awdur heb gyrraedd llyfrgelloedd trydydd parti neu APIs platfform-benodol.

Beth Yn union Yw std::shared_mutex a Pam Ei Ychwanegwyd yn C++17?

Cyn C++17, roedd yn rhaid i ddatblygwyr yr oedd angen semanteg darllenydd-awdur arnynt ddibynnu ar atebion platfform-benodol fel pthread_rwlock_t ar systemau POSIX neu SRWLOCK ar Windows, neu byddent yn defnyddio llyfrgelloedd trydydd parti fel Boost. Cydnabu pwyllgor safonol C++17 y bwlch hwn a chyflwynodd std::shared_mutex ym mhennyn shared_mutex> i fynd i'r afael ag ef yn uniongyrchol.

Mae’r syniad craidd yn syml: mewn llawer o raglenni’r byd go iawn, mae data’n cael ei ddarllen yn llawer amlach nag y mae wedi’i ysgrifennu. Mae std::mutex safonol yn cyfresoli pob mynediad — darlleniadau wedi'u cynnwys — sy'n creu tagfeydd diangen. Mae std::shared_mutex yn codi'r cyfyngiad hwnnw drwy wahaniaethu rhwng dau fodd cloi:

  • Clo a rennir (darllen) — caffaelwyd drwy lock_shared(); gall edafedd lluosog ddal hwn ar yr un pryd, gan ei wneud yn ddelfrydol ar gyfer darlleniadau cydamserol.
  • Clo unigryw (ysgrifennu) - wedi'i gaffael trwy lock(); dim ond un edefyn all ddal hwn ar y tro, ac ni chaniateir unrhyw gloeon a rennir tra'i fod yn cael ei ddal.
  • std::shared_lock - deunydd lapio RAII sy'n galw lock_shared() wrth adeiladu a datgloi_shared() wrth ei ddinistrio, gan atal gollyngiadau adnoddau.
  • std::unique_lock / std::lock_guard — yn cael ei ddefnyddio gyda'r modd unigryw, gan sicrhau bod gweithrediadau ysgrifennu wedi'u diogelu'n llawn a bod eithriadau'n ddiogel.

Mae'r dyluniad modd deuol hwn yn gwneud std::shared_mutex yn ffitio'n naturiol ar gyfer senarios fel caches, cofrestrfeydd ffurfweddu, ac unrhyw strwythur data lle mae darlleniadau yn dominyddu'r llwyth gwaith.

Sut Ydych chi'n Defnyddio std::shared_mutex in Real Code Gyda Sylwadau?

Mae sylwadau yn y cod sy'n defnyddio std::shared_mutex yn arbennig o werthfawr oherwydd mae'n hynod o anodd rhesymu am resymeg arian cyfred. Mae sylwadau mewn sefyllfa dda yn egluro pam y dewiswyd clo penodol, sy'n lleihau'n sylweddol y risg y bydd cynhalwyr y dyfodol yn cyflwyno rasys data yn ddamweiniol. Dyma batrwm nodweddiadol:

cod> # cynnwys 
#cynnwys 
#cynnwys 

dosbarth ConfigCofrestrfa {
    std mutable::shared_mutex mtx_; // yn gwarchod y map isod
    std::map_di-drefn data_;

cyhoeddus:
    // Darllen llwybr: gall edafedd lluosog alw hyn ar yr un pryd
    std::string get(const std::string&key) const {
        std:: clo rhannu_lock(mtx_); // clo a rennir — yn ddiogel ar gyfer darlleniadau cydamserol
        auto mae'n = data_.find(allwedd);
        ei ddychwelyd != data_.end() ? it->ail : "";
    }

    // Ysgrifennu llwybr: angen mynediad unigryw
    set gwag (const std:: llinyn&key, const std::string& val) {
        std::unique_lock clo(mtx_); // clo unigryw — blocio pob darllenydd
        data_[allwedd] = val;
    }
};

Sylwch sut mae'r sylwadau'n esbonio'r bwriad y tu ôl i bob dewis clo yn hytrach nag ailddatgan yr hyn y mae'r cod yn ei wneud yn unig. Dyma'r safon aur: dylai sylwadau ateb pam, nid beth. Mae'r allweddair mutable ar y mutex yn caniatáu i get() gael ei ddatgan const tra'n dal i allu cloi, patrwm cyffredin ac idiomatig.

Mewnwelediad Allweddol: Defnyddiwch bapur lapio clo RAII (std::shared_lock, std::unique_lock) gyda std::shared_mutex - peidiwch byth â galw lock() a datgloi() â llaw. Mae cloi â llaw ym mhresenoldeb eithriadau yn llwybr gwarantedig i ddatgloi ac ymddygiad heb ei ddiffinio.

Beth Yw'r Peryglon Cyffredin Wrth Weithio Gydag std::shared_mutex?

Hyd yn oed gyda sylwadau clir a bwriadau da, mae gan std::shared_mutex drapiau cynnil sy'n baglu datblygwyr profiadol. Y mwyaf peryglus yw uwchraddio clo: nid oes unrhyw ffordd adeiledig i uwchraddio clo a rennir i glo unigryw heb ei ryddhau yn gyntaf. Mae ceisio gwneud hynny heb ryddhau yn creu clo ar unwaith oherwydd bod yr edefyn yn dal clo a rennir wrth aros am y clo unigryw na ellir byth ei ganiatáu cyhyd â bod unrhyw glo a rennir yn bodoli - gan gynnwys yr un y mae'n ei ddal.

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

Camgymeriad cyffredin arall yw diogelu'r gronynnedd anghywir. Weithiau mae datblygwyr yn cloi'n rhy fras, gan drechu pwrpas y patrwm darllenydd-awdur, neu'n rhy gyfyng, gan adael ffenestri lle mae amrywiadau yn cael eu torri rhwng dau gaffaeliad clo ar wahân. Mae sylwadau sy'n disgrifio'r newidyn sy'n cael ei warchod, yn hytrach na dim ond y newidyn sy'n cael ei gloi, yn helpu timau i resymu ynghylch cywirdeb yn ystod adolygiad cod.

Gall perfformiad hefyd eich synnu. Ar systemau dadleuol iawn gyda llawer o ysgrifenwyr, gall std::shared_mutex berfformio'n waeth na std::mutex plaen oherwydd y gorbenion cadw llyfrau ychwanegol. Proffiliwch bob amser cyn cymryd bod cloi'r darllenydd-awdur yn fuddugoliaeth net.

Sut Mae std::shared_mutex yn Cymharu â std::mutex a Dewisiadau Amgen Eraill?

std::mutex yn symlach, yn gyflymach i'w ganfod pan fo'r gynnen yn isel, ac yn briodol pan fydd darllen ac ysgrifennu yn digwydd ar amlder cyfartal yn fras. Mae std::shared_mutex yn disgleirio wrth ddarllen llawer mwy na'r nifer sy'n ysgrifennu - mae cymhareb 10:1 neu uwch yn arfer rhesymol cyn ystyried y switsh.

C++14 wedi cyflwyno std::shared_timed_mutex, sy'n ychwanegu try_lock_shared_for() a try_lock_shared_until() ar gyfer ymgeisiau wedi'u hamseru. Mae std::shared_mutex C++17 yn gollwng yr amrywiadau wedi'u hamseru ar gyfer gweithrediad mwy main. Os oes angen cloi wedi'i amseru ar y llwybr a rennir, mae std::shared_timed_mutex ar gael o hyd ac mae'r ddau fath yn gwbl safonol.

Ar gyfer dewisiadau amgen di-glo, gall std::atomic ynghyd ag archebu cof gofalus weithiau ddisodli mutex yn gyfan gwbl ar gyfer baneri neu gownteri syml, ond ar gyfer strwythurau data cymhleth, std::shared_mutex yw'r ateb mwyaf darllenadwy a chynaladwy yn y llyfrgell safonol o hyd.

Cwestiynau Cyffredin

A all std::shared_mutex achosi newyn?

Ie, gall. Os bydd deiliaid cloeon a rennir newydd yn cyrraedd yn barhaus, efallai y bydd ceisydd clo unigryw yn aros am gyfnod amhenodol - problem glasurol llwgu awdur. Nid yw safon C++ yn mandadu polisi tegwch penodol, felly mae ymddygiad yn dibynnu ar weithrediad. Yn ymarferol, mae'r rhan fwyaf o weithrediadau llyfrgell safonol yn blaenoriaethu cloeon unigryw ar ôl iddynt gael eu ciwio, ond dylech wirio hyn ar gyfer eich cadwyn offer a'ch platfform penodol os yw newyn yn bryder wrth gynhyrchu.

A yw std::shared_mutex yn ddiogel i'w ddefnyddio gyda std::condition_variable?

Mae angen std::unique_lock ar

std::condition_variable, felly nid yw'n gydnaws yn uniongyrchol â std::shared_mutex. Os oes angen i chi aros ar amod tra'n dal mutex a rennir, defnyddiwch std::condition_variable_any, sy'n gweithio gydag unrhyw fath BasicLockable, gan gynnwys std::shared_mutex wedi'i baru â std::shared_lock.

A ddylwn i ychwanegu sylwadau bob tro rwy'n defnyddio std::shared_mutex?

Ar y lleiaf, rhowch sylwadau ar y datganiad mutex i ddisgrifio pa ddata y mae'n ei ddiogelu a'r amrywiadau y mae'n eu cadw. Ym mhob safle clo, mae sylw byr yn esbonio pam y dewiswyd mynediad a rennir yn erbyn mynediad unigryw yn ychwanegu gwerth sylweddol i adolygwyr cod a chynhalwyr y dyfodol. Mae bygiau arian cyfred ymhlith y rhai anoddaf i'w hatgynhyrchu a'u trwsio, felly mae'r buddsoddiad mewn sylwadau clir, manwl gywir yn talu ar ei ganfed lawer gwaith.


Mae rheoli systemau cymhleth - boed yn god C++ cydamserol neu weithrediad busnes cyfan - yn gofyn am yr offer cywir a strwythur clir. Mewayz yw'r OS busnes 207-modiwl y mae dros 138,000 o ddefnyddwyr yn ymddiried ynddo i ddod â'r un eglurder i farchnata, CRM, e-fasnach, dadansoddeg, a mwy, i gyd mewn un platfform gan ddechrau ar ddim ond $19 y mis. Stopiwch jyglo dwsinau o offer sydd wedi'u datgysylltu a dechreuwch redeg eich busnes gyda thrachywiredd meddalwedd sydd wedi'i ddylunio'n dda. Rhowch gynnig ar Mewayz heddiw yn app.mewayz.com i weld sut mae system unedig yn trawsnewid y ffordd y mae eich tîm yn gweithio.