Hacker News

A’ tuigsinn Std: Shared_mutex bho C ++17

Beachdan

10 min read Via www.cppstories.com

Mewayz Team

Editorial Team

Hacker News

Tuigse std::shared_mutex o C++17

std ::shared_mutex, air a thoirt a-steach ann an C++17, na phrìomhachas sioncronaidh a leigeas le iomadh snàithlean glasan co-roinnte (leugh) a chumail aig an aon àm fhad ‘s a nì iad cinnteach gum bi ruigsinneachd a-mhàin airson gnìomhan sgrìobhaidh. Bidh e a’ fuasgladh aon de na dùbhlain concurrency as cumanta ann an C ++ an latha an-diugh le bhith a’ toirt dòigh ghlan, àbhaisteach do luchd-leasachaidh glasadh leughadair-sgrìobhadair a chuir an gnìomh gun a bhith a’ ruighinn gu leabharlannan treas-phàrtaidh no APIan àrd-ùrlair.

Dè dìreach a th’ ann an std::shared_mutex agus Carson a chaidh a chur ris ann an C++17?

Ron C++17, b’ fheudar do luchd-leasachaidh aig an robh feum air semantics leughadair-sgrìobhaidh a bhith an urra ri fuasglaidhean a bha sònraichte don àrd-ùrlar mar pthread_rwlock_t air siostaman POSIX no SRWLOCK air Windows, no cleachdaidh iad leabharlannan treas-phàrtaidh leithid Boost. Dh’aithnich a’ chomataidh àbhaisteach C++17 am beàrn seo agus thug iad a-steach std::shared_mutex anns a’ bhann-cinn gus dèiligeadh ris gu dìreach.

Tha am prìomh bheachd sìmplidh: ann am mòran phrògraman san t-saoghal fhìor, thathas a’ leughadh dàta fada nas trice na tha e sgrìobhte. Bidh std::mutex àbhaisteach a’ sreathachadh a h-uile ruigsinneachd - leughaidhean air an toirt a-steach - a chruthaicheas botail neo-riatanach. Togaidh std::shared_mutex an cuingeachadh sin le bhith ag eadar-dhealachadh eadar dà mhodh glasaidh:

  • Glais roinnte (leugh) - air fhaighinn tro lock_shared(); 's urrainn dha ioma-snàthainn seo a chumail aig an aon àm, ga dhèanamh air leth freagarrach airson leughaidhean aig an aon àm.
  • Glais shònraichte (sgrìobh) - air fhaighinn tro glas(); chan fhaod ach aon snàthainn seo a chumail aig aon àm, agus chan eil glasan co-roinnte ceadaichte fhad 's a tha e ga chumail.
  • std ::shared_lock - pasgan RAII a chuireas fios gu lock_shared() air an togail agus unlock_shared() nuair a thèid a sgrios, a' cur casg air aoidion ghoireasan.
  • std ::unique_lock / std::lock_guard - air a chleachdadh leis a' mhodh a-mhàin, a' dèanamh cinnteach gu bheil obraichean sgrìobhaidh làn dhìon is sàbhailte a-mhàin.

Tha an dealbhadh dà-mhodh seo a’ fàgail std::shared_mutex gu nàdarrach iomchaidh airson suidheachaidhean leithid tasgadan, clàran rèiteachaidh, agus structar dàta sam bith far a bheil leughaidhean a’ faighinn làmh an uachdair air an eallach obrach.

Ciamar a chleachdas tu std::shared_mutex ann am Fìor Chòd le Beachdan?

Tha beachdan sa chòd a chleachdas std::shared_mutex gu sònraichte luachmhor a chionn ’s gu bheil loidsig airgead-crìche gu math duilich a reusanachadh mu dheidhinn. Tha beachdan ann an deagh shuidheachadh a’ soilleireachadh carson a chaidh seòrsa glas sònraichte a thaghadh, a lùghdaicheas gu mòr an cunnart gun toir luchd-gleidhidh san àm ri teachd rèisean dàta a-steach gun fhiosta. Seo pàtran àbhaisteach:

 # cuir a-steach 
# cuir a-steach 
# cuir a-steach 

clas ConfigRegistry {
    mutable std ::shared_mutex mtx_; // a’ dìon a’ mhapa gu h-ìosal
    std ::unordered_map data_;

poblach:
    // Slighe leughaidh: faodaidh ioma-snàithlean a bhith ag ainmeachadh seo aig an aon àm
    std :: string get (const std :: string & key) const {
        std :: glas roinnte_lock (mtx_); // glas co-roinnte - sàbhailte airson leughaidhean co-aontach
        auto it = data_.find(key);
        thoir air ais e!= data_.end() ? it-> an dàrna : "";
    }

    // Sgrìobh slighe: tha feum air ruigsinneachd sònraichte
    seata falamh (const std :: sreang & iuchair, const std :: sreang & val) {
        std::unique_lock glas (mtx_); // glas toirmeasgach - a’ bacadh a h-uile leughadair
        data_[iuchair] = val;
    }
};

Thoir an aire mar a tha na beachdan a’ mìneachadh an rùn air cùl gach roghainn glasaidh seach dìreach ag ath-aithris na bhios an còd a’ dèanamh. Seo an inbhe òir: bu chòir do bheachdan freagairt carson, chan e . Tha am prìomh fhacal mutable air an mutex a’ leigeil le get() a ghairm const fhad ‘s a tha e comasach fhathast pàtran cumanta is gnàthasach a ghlasadh.

Prìomh shealladh: Cleachd pasgain glasaidh RAII an-còmhnaidh (std::shared_lock, std::unique_lock) le std::shared_mutex - na cuir fòn gu lock() agus fuasgail() le làimh. Tha glasadh làimhe an làthair eisgeachdan na shlighe cinnteach gu glasan-stad agus giùlan neo-mhìnichte.

Dè na duilgheadasan a tha cumanta nuair a bhios tu ag obair le std ::shared_mutex?

Fiù ‘s le beachdan soilleir agus deagh rùn, tha glacaidhean seòlta aig std::shared_mutex a bhios a’ dol suas luchd-leasachaidh eòlach. 'S e àrdachadh glas an rud as cunnartaiche: chan eil dòigh ann airson glas co-roinnte àrdachadh gu glas air leth gun a leigeil ma sgaoil an toiseach. Le bhith a’ feuchainn ri sin a dhèanamh gun a bhith air a leigeil ma sgaoil cruthaichidh sin glasadh sa bhad leis gu bheil an t-snàthainn a’ cumail glas co-roinnte fhad ‘s a tha e a’ feitheamh ris a ’ghlas shònraichte nach gabh a thoirt seachad fhad‘ s a tha glas co-roinnte ann - a ’toirt a-steach am fear a tha e a’ cumail.

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

'S e mearachd cumanta eile a bhith a' dìon na granularity ceàrr. Bidh luchd-leasachaidh uaireannan a’ glasadh ro fharsaing, a’ dèanamh a’ chùis air adhbhar pàtran an leughadair-leughaidh, no ro chumhang, a’ fàgail uinneagan far a bheilear a’ briseadh eadar-dhealachaidhean eadar dà ghlas fa-leth. Bidh beachdan a tha a’ toirt cunntas air an caochladair ga dhìon, seach dìreach an caochladair glaiste, a’ cuideachadh sgiobaidhean le bhith ag adhbharachadh a thaobh ceartachd rè sgrùdadh còd.

Faodaidh coileanadh iongnadh a dhèanamh ort cuideachd. Air siostaman far a bheil mòran sgrìobhadairean a’ gearan, dh’ fhaodadh std::shared_mutex coileanadh nas miosa na std::mutex sìmplidh ri linn nan cosgaisean glèidhidh a bharrachd. Dèan pròifil an-còmhnaidh mus gabh thu ris gur e buannachadh lom a th’ ann glasadh leughadair-sgrìobhadair.

Ciamar a tha std ::shared_mutex an coimeas ri std ::mutex agus roghainnean eile?

Tha

std::mutex nas sìmplidhe, nas luaithe ri fhaighinn nuair a tha connspaid ìosal, agus iomchaidh nuair a bhios leughadh is sgrìobhadh a’ tachairt aig tricead co-ionann cha mhòr. Bidh std ::shared_mutex a’ deàrrsadh nuair a thèid a leughadh gu math nas àirde na na sgrìobhaidhean - tha co-mheas 10:1 no nas àirde na riaghailt òrdail reusanta mus beachdaich thu air an tionndadh.

Thug C++14 a-steach std::shared_timed_mutex, a chuireas ris try_lock_shared_for() agus try_lock_shared_until() airson oidhirpean le ùine. Bidh std> C ++17::shared_mutex a’ leigeil sìos na caochlaidhean tìmeil airson buileachadh nas caol. Ma tha feum agad air glasadh le ùine air an t-slighe cho-roinnte, tha std::shared_timed_mutex ri fhaighinn fhathast agus tha an dà sheòrsa gu tur àbhaisteach.

Airson roghainnean eile gun ghlas, faodaidh std::atomic còmhla ri òrdachadh cuimhne faiceallach uaireannan mutex a chur an àite brataichean no cunntairean sìmplidh, ach airson structaran dàta iom-fhillte, std::shared_mutex fhathast am fuasgladh as leughaidh agus as seasmhaiche san leabharlann àbhaisteach.

Ceistean Bitheanta

An urrainn std::shared_mutex acras adhbhrachadh?

Seadh, faodaidh. Ma chumas luchd-gleidhidh glas co-roinnte ùr a’ ruighinn an-còmhnaidh, faodaidh neach-iarrtais glas-glas feitheamh gun chrìoch - duilgheadas clasaigeach acras sgrìobhadair. Chan eil an inbhe C ++ ag òrdachadh poileasaidh cothromachd sònraichte, agus mar sin tha giùlan an urra ris a’ bhuileachadh. Ann an da-rìribh, tha a’ mhòr-chuid de bhuileachadh leabharlainn àbhaisteach a’ toirt prìomhachas do ghlasan toirmeasgach aon uair ‘s gu bheil iad ann an ciudha, ach bu chòir dhut seo a dhearbhadh airson an t-sèine inneal agus an àrd-ùrlar sònraichte agad ma tha an t-acras na adhbhar dragh ann an cinneasachadh.

A bheil std::shared_mutex sàbhailte a chleachdadh le std :: condition_variable?

Tha feum aig std::unique_lock air std::condition_variable, 's mar sin chan eil e co-chòrdail gu dìreach ri std::shared_mutex. Ma dh'fheumas tu feitheamh air chumha fhad 's a tha thu a' cumail mutex co-roinnte, cleachd std::condition_variable_any, a dh'obraicheas le seòrsa BasicLockable sam bith, a' gabhail a-steach std::shared_mutex le paidhir le std::shared_lock.

Am bu chòir dhomh beachdan a chur ris a h-uile uair a chleachdas mi std::shared_mutex?

Aig a’ char as lugha, thoir beachd air foillseachadh an mutex gus innse dè an dàta a tha e a’ dìon agus na caochlaidhean a tha e a’ cumail. Aig gach làrach glasaidh, tha beachd goirid a’ mìneachadh carson a chaidh ruigsinneachd co-roinnte an-aghaidh ruigsinneachd toirmeasgach a thaghadh a’ cur luach mòr ri luchd-sgrùdaidh còd agus luchd-gleidhidh san àm ri teachd. Tha bugaichean concurrency am measg an fheadhainn as duilghe ath-riochdachadh agus a chàradh, agus mar sin tha tasgadh ann am beachdan soilleir, mionaideach a’ pàigheadh ​​mòran thursan thairis.


Tha a bhith a’ riaghladh shiostaman iom-fhillte - ge bith an e còd C++ co-shìnte no gnìomhachd gnìomhachais slàn a th’ ann - ag iarraidh na h-innealan ceart agus structar soilleir. Is e Mewayz an OS gnìomhachais 207-modal anns a bheil earbsa aig còrr air 138,000 neach-cleachdaidh gus an aon soilleireachd sin a thoirt gu margaidheachd, CRM, e-malairt, anailisean agus barrachd, uile ann an aon àrd-ùrlar a’ tòiseachadh aig dìreach $19 sa mhìos. Stad le bhith a ’suathadh dusanan de dh’ innealan neo-cheangailte agus tòisich a ’ruith do ghnìomhachas le mionaideachd bathar-bog air a dheagh dhealbhadh. Feuch Mewayz an-diugh aig app.mewayz.com agus faic mar a dh’ atharraicheas siostam aonaichte an dòigh sa bheil an sgioba agad ag obair.