Programim dhe zhvillim, javascript, python, php, html

Cilat lloje të të dhënave janë të sigurta për t'u lexuar dhe shkruar pas marrjes së tyre nga një strukturë e aksesueshme njëkohësisht?

Ndoshta nuk është e qartë nga vetë pyetja se çfarë po kërkoj këtu, kështu që më lejoni të sqaroj. Si një ushtrim në të njëjtën kohë, unë jam duke luajtur me shkrimin e një cache që duhet të jetë i aksesueshëm nga kërkesa të shumta të njëkohshme. Përmbajtja e memories është e tipit ndërfaqe{}, kështu që mund të përfshijë çdo gjë, duke përfshirë feta, harta dhe struktura. Kur kap diçka me metodën "Get", e mbyll atë ndërsa e lexoj dhe më pas e kthej përmbajtjen dhe e përfundoj me një RUnlock të shtyrë.

Kjo funksionon mirë për numrat dhe vargjet dhe çdo vlerë tjetër që kopjohet automatikisht në kthim. Por unë jam i shqetësuar se fetat, hartat dhe strukturat nuk kopjohen në të vërtetë, kështu që gjëja e kthyer, nëse lexohet ose modifikohet sikur të ishte një kopje, në të vërtetë do të ndryshonte të dhënat në cache dhe duke e bërë këtë jashtë një mutex.

Sigurisht, ky është një problem në kushte gare. Kështu që unë nuk dua të kthej diçka nga Get që nuk është e sigurt për t'u ndryshuar dhe më pas të kaloj në një metodë Set për ta përditësuar. Pra, këtu janë pyetjet:

1) A kam të drejtë duke supozuar se këto lloje të të dhënave paraqesin probleme për një skenar si ky?

2) Si mund të shkohet për zgjidhjen e kësaj çështjeje, në mënyrë që të krijohet një metodë Get, vlerat e së cilës mund të manipulohen lirisht pa frikën e dështimit në kushte gare?


  • Siç thekson Ralph në përgjigjen e tij, ju madje keni probleme me llojet që i konsideroni të sigurta, kështu që është shumë më e vështirë nga sa duket në sipërfaqe. Shembulli klasik është nëse përdorni cache-in tuaj për të zbatuar një numërues. Dy rutina Get në mënyrë të sigurtë vlerën aktuale të 1, e rrisin atë dhe Set e kthejnë atë. Tani numëruesi është gabimisht 2 në vend të 3, por qasja në vetë cache është konsistente. 02.11.2014

Përgjigjet:


1

Ju keni të drejtë duke supozuar se këto lloje të të dhënave, kryesisht referencat dhe treguesit e strukturave mund të shkaktojnë një problem për arsyet për të cilat do të flas më poshtë.

Unë shoh vërtet dy probleme me të cilat po përballeni. E para, është që ju duhet të mbroni cache-in tuaj nga aksesi i njëkohshëm në mënyrë që cache të jetë gjithmonë në gjendjen e duhur. Nëse po ndryshoni cache dhe përdorni një bllokues "shkrimi", cache juaj do të ruajë integritetin e saj kur të ndryshohet në një farë mënyre. Gjithashtu, për sa kohë që merrni një bllokim "leximi" kur lexoni nga cache, ju garantohet se do të lexoni nga cache juaj me të njëjtin integritet. Pra, siç qëndron tani, bravat që mbrojnë cache-in tuaj punojnë vetëm në mbrojtjen e vetë cache-it. Këto bravë nuk do të bëjnë asgjë për të mbrojtur artikujt e ruajtur në cache.

Kjo është çështja e dytë me të cilën po merreni: Duke supozuar se cache-ja juaj është e mbrojtur, mendoni se çfarë do të ndodhte nëse dy gorutina të veçanta bëjnë një operacion të sinkronizuar siç duhet Get nga cache-ja juaj. Ata as nuk duhet domosdoshmërisht të marrin objektin në të njëjtën kohë, por nëse në një farë mënyre përfundojnë duke "marrë" një tregues për ndonjë strukturë ose një referencë në një hartë/pjesë, kjo do të thotë se ata potencialisht mund të dy të ndryshojnë të njëjtin objekt për të cilat ata të dy mbajnë referenca. Kjo shfaqet si problemi i dytë që po përshkruani.

Pra, cilat janë opsionet tuaja?

  1. Vetëm llojet e vlerave të ruajtura të cilat siç e keni vërejtur mund të jenë kufizuese dhe/ose të shtrenjta sepse gjithçka duhet të kopjohet.
  2. Ruani vetëm disa lloje të personalizuara që janë të sinkronizuara duke u siguruar gjithashtu që të marrin bravat e duhura mbi veten e tyre kur ato ndryshojnë ose lexohen.
  3. Bëjeni cache-në tuaj më të zgjuar në mënyrë që të ketë konceptin e pronësisë ku do të kthejë me kënaqësi një objekt nga cache dhe do të lejojë vetëm një gorutinë të "mbahet" mbi të derisa të përfundojë ajo gorutinë. Gorutina të tjera do të duhet të presin që ai objekt të lëshohet derisa gorutina e mëparshme të përfundojë me të. Ose këtë, ose mund ta dizenjosh Get që të dështojë dhe të kthehet menjëherë nëse përpiqet të marrë një artikull që nuk ishte aktualisht i disponueshëm. Ky koncept përdoret gjerësisht për të ndërtuar bravë të shpërndarë në një arkitekturë të serverit të klientit, ku mund të ketë shumë klientë që duan qasje në një objekt dhe bllokimi i shpërndarë siguron që vetëm një klient mund ta mbajë bllokimin.

Konsideroni se koncepti i pronësisë është i rëndësishëm. Dikush mund të thotë: thjesht përdorni kanale, që do të rregullojnë gjithçka. Por ju madje mund të përfundoni në të njëjtën varkë nëse dërgoni një lloj referimi ose një tregues në një strukturë në 5 kanale të ndryshme. Këto 5 kanale të ndryshme ndoshta mund të ndryshojnë të njëjtin objekt që po mbajnë. Uh Oh! i njëjti problem shfaqet përsëri. Kjo është arsyeja pse është e rëndësishme që kur kaloni një artikull në një kanal, të hiqni dorë nga pronësia për të mos e ndryshuar atë.

Siç më tha dikush sot...programimi i njëkohshëm është i vështirëdhe ndoshta ka modele shtesë që mund t'i provoni, por shpresoj që kjo t'ju japë më shumë informacion mbi problemin me të cilin po trajtoni. Një gjë që duhet të dini është se nuk ka vërtet një përgjigje të qëndrueshme për këtë, shumë prej saj do të varet nga natyra e mënyrës se si do të sillet aplikacioni juaj në fund të fundit.

01.11.2014
  • Përgjigja juaj padyshim ndihmon për të sqaruar më tej problemin. Duket sikur nuk ka një zgjidhje vërtet të mirë. Unë jam duke menduar për një skenar ku dy struktura të kyçura në mënyrë unike në hartën e referencës së memories X. Edhe nëse keni bravë në vetë strukturat, gjërat mund të bëhen të shpejta me hartën dhe të dështojnë. Zgjidhja e vetme e sigurt për këtë do të ishte grumbullimi i të dhënave gjatë vendosjes së tyre dhe anulimi kur i merrni ato. Më mirë e sigurt dhe e shtrenjtë se sa efikase dhe e paqëndrueshme, mendoj. Vlerësoni përgjigjen e detajuar për të më shtyrë të mendoj në drejtimin e duhur. 04.11.2014

  • 2

    1) A kam të drejtë duke supozuar se këto lloje të të dhënave paraqesin probleme për një skenar si ky?

    Po. Hartat dhe pjesët kanë tregues për strukturat e brendshme të të dhënave që nuk kopjohen gjatë caktimit. Por meqenëse jeni duke përdorur një interface{}, mund të keni edhe struktura me tregues, të cilët mund të tregojnë struktura me më shumë tregues e kështu me radhë.

    2) Si mund të shkohet për zgjidhjen e kësaj çështjeje, në mënyrë që të krijohet një metodë Get, vlerat e së cilës mund të manipulohen lirisht pa frikën e dështimit në kushte gare?

    Zgjidhja më e lehtë është të lejoni që një objekt t'i kthehet një klienti të vetëm në të njëjtën kohë, në mënyrë që të ketë vetëm një version të drejtpërdrejtë, të ndryshueshëm. Ju gjithashtu mund të serializoni objektet, në mënyrë që gjithçka të jetë gjithmonë një kopje.

    Çdo gjë që duhet të shkruhet dhe të lexohet njëkohësisht duhet të ketë sinkronizimin e duhur. Periudha.

    31.10.2014
    Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..