Dėl kokių veiksmų, atliktų būdamas girtas, labai gėdiesi? Panikos sutrikimų veikimo testo rezultatai

ŠIRDIES NEUROZĖ (KARDIOFOBIJA). Ypatinga fobijos forma kartu su panikos sindromu yra kardiofobija, kurią reikėtų apibūdinti ypač dėl būdingo klinikinio vaizdo ir reikšmingo dažnio. Dažniausiai tai pasireiškia jauniems žmonėms, dažniau vyrams, taip pat vaikams.

Paroksizminis nerimo būsenos, kai pacientai baiminasi, kad širdis nustos veikti ir mirs, gali atsirasti ir nesant somatinei ligai. Kito priepuolio pradžioje atsiranda pykinimas, galvos svaigimas, vidinis nerimas, nedidelis širdies suspaudimas.

Tačiau daugeliu atvejų be jokio įspėjimo įvyksta sunkus priepuolis: širdies plakimas jaučiamas visame kūne, šiek tiek padidėja kraujo spaudimas, stiprus suspaudimo ir veržimo jausmas širdies srityje, oro trūkumas, prakaitavimas, galvos svaigimas ir alpimo (bet ne sąmonės praradimo) jausmas, viso kūno drebulys ir pagrindinė baimė. Pacientas tiki, kad per sekundę jo širdis sustos ir jis mirs. Tai savęs sunaikinimo ir mirties baimė. At stiprus susijaudinimas ligoniai bėga ir prašo pagalbos. Jei baimės priepuolis ištinka keliaujant automobiliu, pacientas yra priverstas sustoti ir padaryti pertrauką.

Po pirmojo priepuolio atsiranda fobijos vystymasis. Pacientai praranda psichinę pusiausvyrą, gyvena nuolatinėje baimėje, laukdami kito priepuolio ar mirties, išgyvendami baimės baimę (laukimo baimę, fobiją). Tuo pačiu jiems nepadeda ir terapeuto žinutė apie normalūs rodikliaiširdies veikla, nei įsitikinimas, kad ankstesni priepuoliai neturėjo pasekmių. Priepuolių dažnis ir intervalai tarp jų yra nereguliarūs. Pacientas kartkartėmis atidžiai stebi savo širdies funkcijas, kontroliuoja pulsą ir registruoja menkiausius jo nukrypimus. Atsitiktines ekstrasistoles jis suvokia kaip neginčijamus beviltiškos baigties ligos požymius.

Pacientai atsargiai stebi kitas vegetacines apraiškas, taip pat nedidelius jų savijautos svyravimus. Pacientai rūpinasi savimi, sunkiai išdrįsta vaikščioti, stengiasi pašalinti visą stresą, rūpesčius ir, visų pirma, sunkias situacijas, kad išvengtų priepuolio (išvengiamo elgesio). Vietoj mirties baimės daugeliu atvejų vis dažniau atsiranda baimės ir baimę sukeliančių situacijų baimė.

IŠVAIZDOS SĄLYGOS. Pirmojo kardiofobinio priepuolio priežastis dažnai yra ūmus konfliktas ir pervargimas, išsiskyrimas ir nusivylimas, vienatvės ir apleistumo situacija, taip pat nerimas artimo žmogaus širdies mirties atveju.

Žinojimas, kad širdies mirtis gali ištikti visada, net ir jaunam ir sveikam, tampa nerimą keliančiu veiksniu. Intensyvus kavos ir nikotino vartojimas gali paskatinti šį procesą. Pradžia dažnai ateina iš vaikystės. Dažniausiai nukenčia išlepinti ir išlaikomi vaikai, turintys ryškų priklausomybę nuo motinos, daugiausia ambivalentiškų požiūrių: viena vertus, meilės lūkesčius ir nepriklausomybės troškimą su agresyviais impulsais, kita vertus, prieštaringomis prieraišumo ir prisirišimo fantazijomis. atskyrimas. Tokios nuostatos ypač pavojingos, kai nutrūksta ryšiai, atsiranda išsiskyrimų, nusivylimų. Kardiofobas dažnai gyvena baimėje dėl išsiskyrimo, kol nesuvokia, kad to nori ir bijo. Reguliariai kyla bendrų problemų su tėvais, konfliktai su partneriais.

GYDYMAS
Jei į ūminė būklė gydytojo buvimas ir pokalbis su juo nesukelia pagerėjimo, nurodomi trankviliantai ar beta blokatoriai. Kaip ir kiti pacientai, sergantys neurozėmis su baime, daugelis fobikų bando savarankiškai gydytis alkoholiu; bet jo poveikis yra nepakankamas, o pavojus tapti priklausomam nuo alkoholio yra didelis. Farmakoterapija yra tik pagalbinė priemonė, pirmiausia ūminiais atvejais, taip pat pradinė veiksminga priemonė.

Psichoterapija yra lemiama. Kuo anksčiau tai prasidės, tuo geriau. Tiriant priežastis ir konfliktines situacijas iš karto po pirmųjų kardiofobinių priepuolių gali sustabdyti tolesnį fobijos vystymąsi. Vėliau gydymas yra sunkesnis ir reikalinga ilgalaikė psichoterapija.

Esant šiems ir kitiems nerimo sutrikimams, ypač indikuotina elgesio terapija (sujaudinimo akistata, kognityvinė terapija, pasitikėjimo savimi lavinimas). Išskirtinis nerimo vengimo mokymų bruožas yra tas, kad jis veikia pagal desensibilizacijos modelį (atitinkamoms kasdienių situacijų sąlygoms), o nerimo valdymo mokymuose naudojamas priverstinis panirimas į fobinę situaciją (potvynis) ir įveikos strategijų formavimas. Esant sunkiems nerimo sutrikimams, būtina atlikti klinikinis gydymas naudojant įvairius psichoterapijos modelius.


02.10.2011, 21:27

Už tai, kad sumušė vaikiną ir pakabino jo marškinėlius ant medžio.O ji idiotą vaikiną viena persekiojo porą kilometrų ir jam nukritus pradėjo šlapintis.Bet jie to nusipelnė.

Didelėje kompanijoje pykinau merginą ir sakiau, kad jos vaikinas ją pirko išpardavimo metu, taip pat valgė bananus ir mikroautobuse visiems padėjo žieveles ant kelių, taip pat nuolat rengiu lesbiečių pasirodymus baruose, kartą pažiūrėjau po sijonais. VIP klubo padavėjų ir komentavo, bet apskritai aš blogai išgėręs iš karto pamirštu, kad man patinka žmonės, kurie sako, jei pabundi ir tau gėda, bet neatsimenu kodėl būtent apie mane

Po paskutinio girtavimo pavargau:
1. rėkė iš balkono vaikinui "čiulpk mane"
2. suvalgė cigaretę
3. mėtė obuolius
4. paskambino vaikinui ir pasakė, kad neduosiu jam sekso grubiai
5. greipfrutų sultyse nuskendusius bulius
6. paskambino mamai ir pasakė, kad esu blaivus
7. Paprašiau savo draugės vaikino, kad atneštų mums vyno.
8. Šlapinau pro tualetą, nes jų buvo 2 - pasirinkau ne tą, o tada nukritau
9. iškrito iš vonios

Kartą bėgau po butą su peiliu paskui vyrą, nors išgėriau porą taurių šampano. Kitą rytą man pasidarė baisu – o jei smogsiu jam peiliu, bet tiesiog nusprendžiau jį išgąsdinti. Ir aš nežinau, kodėl gavau tokį smūgį!

Visada yra tas pats, pavyzdžiui, kai aš prisigėręs einu į parką ieškoti keiksmažodžių, kad iš jų pasijuokčiau, arba kuriu tokias temas forume... ryte galvoju, ar aš kvailas?...

Kartą vienas vaikinas ant manęs smogė, aš buvau toks girtas, kad pradėjau jam populiariai aiškinti, kad nieko blogo nebus, nes aš buvau „Kruvinoji Marija“ (jie buvo) ir ši pravardė taip įsmigo į mano sielą, kad beveik sušuko visiems, kuriuos sutikau: „Aš – Kruvinoji Marija“, laimei, tai nebuvo mano gimtajame mieste

-* paskambino mano buvusiajam, išsakiau viską, ką apie jį galvoju
*paskambino mano mylimajam, pasakė, kaip aš jo noriu
*valgė shawarma su folija
* keikėsi vaikinui, kurį sutikau klube, nors jis man padėjo ir atnešė vandens
*šoko striptizą klube konkurse, gavo antrąją vietą
*metė ledą į nepažįstamą žmogų
*mano vyro draugas vairuoja geltoną Hummerį. Nieko panašaus Korėjoje nemačiau. kai visi kartu eidavome į vakarėlį. Išlenkiau iš savo vyro mašinos ir, rodydamas į priekyje važiuojantį Hummer, sušukau, kad ši mašina yra mano draugas.
*vakar buvau klube. ryte važiuodamas taksi namo vairuotojui pasakiau: [vertimas iš korėjiečių k. pažodžiui!] „Maistas, kurį valgiau, man pasakė, kad jis nori išeiti!
*Aš taip pat turiu draugą mongolą. Aš užlipau jam ant nugaros, priverčiau jį nešti mane ant nugaros ir visą gatvę šaukiau, kad tai mano mongolų arklys.
bet apskritai buvo daug daugiau, neprisiminsi...

Parašiau vaikinui 4 valandą ryto “ Labos nakties, brangu"

Mes su draugais prisigėrėme konjako, visi ėjo namo, o aš kvailai išsikviečiau taksi (buvo 3 val.) ir nuėjau pas savo buvusį vaikiną, su kuriuo išsiskyrėme prieš 4 mėnesius (likome draugais). nepamenu, kaip aš įėjau į įėjimą, patekau į jo butą, turėjau laužti duris ir šaukti „VEIK MARAT“, jis, vargšelis, išprotėjo. Nutempė mane namo ir į šaltą dušą, davė stiprios arbatos. .Po dvieju valandu isvaziavau, o tada kai supratau ka padariau, TIKRAI BUVO GĖDA.Po to jie susitaikė ir iki šiol kartu. Po to aš negeriu daugiau taurės šampano.


...

02.10.2011, 22:09

Nužudytoji ėjo su vaikinu per sodą, o tada man atrodė, kad jis mane kažkaip įžeidė, žengdamas kelis žingsnius priekyje, o ne šalia. Įsižeidžiau ir įlipau į medį, bet jis to net nepastebėjo... pusantros valandos lakstė po sodą manęs ieškodamas... o aš ramiai nualpau ant medžio ir miegojau iki ryto. ...
...
Tačiau ryte iš karto negalėjau prisiminti, kaip atsidūriau ant šakų. Dieve, kaip buvo po to
;D;D;D

Interpretacija

02.10.2011, 22:42

Man gėda dėl tam tikrų veiksmų, padarytų būdamas blaivus :) Bet tai artimesnė filosofijai. Išgėrus... daug kas buvo linksma, gėda... ne, atsiprašau)))))

Elena Lotus

02.10.2011, 23:17

Vakar supratau, kad mano telefonas (OOO!!!) nebe mano, prisigėriau.smarkiai.ir (kas mane pažįsta, nesakyk, kad geriu kaip pelė) tada kažką padariau... tik artimiems draugams, didele paslaptimi ir tada pagalvosiu kam galiu pasakyt... restoranas Paberti ir vel sukrepe.Dabar ziuriu fotogalerija tikiuosi pamatyti kas atsitiko:(bet as Aš nesigėdiju... ne... Tiesiog maniau, kad esu padorus.

02.10.2011, 23:31

;D;D;D
Visada laikiausi, kad tetos negertų!!! VISI!!!;)

..;D;D;D tu kalbi tiesą

02.10.2011, 23:36

Girta moteris – kaip kiniška pūkinė striukė: minkšta ir priglunda.
Galygin

Elena Lotus

02.10.2011, 23:41

Bet vyrams patinka taip? Visi gali gerti. o tetos ir dėdės...tik reikia saugotis...šiandien galvos neskauda...sielą skauda...ar atsigersi? Tai tik užburtas ratas;)

03.10.2011, 00:15

Gerk bet ką ir viską, kol esi jaunas ir sveikas :)

03.10.2011, 01:48

pasirinktinai pavogtas iš moterų forumo :)

Vos nesišlapinau į skalbinių krepšį priešais mamą..... susipainiojau su tualetu.... oi....

Nužudytoji ėjo su vaikinu per sodą, o tada man atrodė, kad jis mane kažkaip įžeidė, žengdamas kelis žingsnius priekyje, o ne šalia. Įsižeidžiau ir įlipau į medį, bet jis to net nepastebėjo... pusantros valandos lakstė po sodą manęs ieškodamas... o aš ramiai nualpau ant medžio ir miegojau iki ryto. ...
...
Tačiau ryte iš karto negalėjau prisiminti, kaip atsidūriau ant šakų. Dieve, kaip buvo po to

Balkone buvo baseinai ir puodai, kuriuose mama augino svogūnus. Aš „silpnai“ pyksdavau kiekviename iš šių puodų =((((savo lovose šiukšliadėžė, aš čia, aš nusprendžiau pamilti ant tavo žalumynų!

03.10.2011, 05:35

Mes su draugais prisigėrėme konjako, visi ėjo namo, o aš kvailai išsikviečiau taksi (buvo 3 val.) ir nuėjau pas savo buvusį vaikiną, su kuriuo išsiskyrėme prieš 4 mėnesius (likome draugais). nepamenu, kaip aš įėjau į įėjimą, patekau į jo butą, turėjau laužti duris ir šaukti „VEIK MARAT“, jis, vargšelis, išprotėjo. Nutempė mane namo ir į šaltą dušą, davė stiprios arbatos. .Po dvieju valandu isvaziavau, o tada kai supratau ka padariau, TIKRAI BUVO GĖDA.Po to jie susitaikė ir iki šiol kartu. Po to aš negeriu daugiau taurės šampano.

Tai gana tikra istorija meilė.
Ir apie gėrimo naudą.

(Gerkite, merginos, ir laimė ateis pas jus.)

Žiniatinklyje yra daugybė sprendimų, skirtų emuliuoti daugiagiją PHP. Dažniausiai jie yra pagrįsti šakėmis, tačiau yra ir temos variantų naudojant curl, proc_open ir kt.

Dėl vienokių ar kitokių priežasčių visi variantai, su kuriais susidūriau, man netiko ir turėjau rašyti savo sprendimą.
Turėjau šiuos reikalavimus:

  • Šakių naudojimas;
  • Sinchroninis režimas su sąsajos išsaugojimu, jei nėra reikiamų plėtinių;
  • Vaikų procesų pakartotinis naudojimas;
  • Pilnas duomenų apsikeitimas tarp procesų. Tie. paleiskite argumentus ir gaukite rezultatą, kai baigsite;
  • Gebėjimas keistis įvykiais tarp vaikiško „siūlo“ proceso ir pagrindinio proceso veikimo metu;
  • Darbas su gijų telkiniu išlaikant pakartotinį naudojimą, perduodant argumentus ir siekiant rezultatų;
  • Vykdymo laiko klaidų tvarkymas;
  • Darbo atlikimo laikas, darbo laukimas pagal siūlą, inicijavimas;
  • Maksimalus našumas;
Rezultatas – biblioteka AzaThread(senas pavadinimas – CThread).

Nekantraujantiems čia yra nuoroda į šaltinį:
github.com/Anizoptera/AzaThread

apibūdinimas

AzaThread suteikia paprastą sąsają gijų klasėms kurti. Kurie iš tikrųjų naudoja atskirus procesus, kad veiktų asinchroniškai, bet jums tai neturėtų rūpėti. Galite siųsti įvykius iš gijos, grąžinti rezultatus, naudoti vieną giją daug kartų perduodant jai paleidimo argumentus arba sukurti 16 gijų telkinį, kuriame jūsų užduotis sukrauna kaip karštus pyragus, nekreipdami dėmesio į tai, kad darbas vyksta skirtinguose procesuose. .

Be to, galite lengvai išbandyti bibliotekos veikimą įvairiais režimais, pasirinkdami optimalų gijų skaičių ir duomenų perdavimo tarp procesų parinktį specialiai jūsų konfigūracijai.

Norint visapusiškai veikti, reikalingi šie plėtiniai: gyvas, pozix Ir pcntl.

Ryšiui tarp procesų biblioteka naudoja LibEvent ir suporuotus lizdus. Palaiko 5 duomenų perdavimo parinktis (argumentus, rezultatus ir įvykių duomenis)!

Iš karto pateikiu parinktis su veiklos duomenimis. Išbandyta naudojant aštuonių gijų telkinį Intel Core i7 2600K 3,40 GHz (Ubuntu 11.04 virtualioje mašinoje VMware). Pateikiami vidutiniai 10 testo pakartojimų rezultatai jps formatu (darbų per sekundę – užduočių skaičius tiesiog gaunant argumentus ir siunčiant duomenis per sekundę).

Automatiškai pasirenkamas darbo su lizdais plėtinys. Jei yra, naudojamas plėtinys lizdai, kuris pagerina našumą. Priešingu atveju jis bus naudojamas srautas.

Vaiko procesas klausosi visų galimų signalų. Pagal numatytuosius nustatymus visi jie (išskyrus SIGWINCH ir SIGINFO) yra išjungiami. Bet tai gali būti lengvai nepaisoma sukuriant metodą gijų klasėje su signalo pavadinimu. Pavyzdžiui sigWinch.

Pirminiame procese visi signalai taip pat perimami pagal numatytuosius nustatymus. Tai galima pakeisti nustatant klasės parametrą klausykite MasterSignals meluoti. Tokiu atveju bus apdorojamas tik SIGCHLD. Galite lengvai pridėti savo tvarkykles sukurdami statinį metodą, vadinamą m< имя сигнала > . Pavyzdžiui mSigTerm.

Jei antrinis procesas dėl kokios nors priežasties miršta, klasė automatiškai išsišakos, kai bus paleista nauja užduotis. Tai nutinka nepastebimai ir jums visai nereikia apie tai galvoti. Atsiradus klaidai egzemplioriaus tiesiog nereikia kurti iš naujo.

Vaikų procesas periodiškai tikrina, ar yra pirminis procesas. Jei jis staiga miršta, vaikas automatiškai baigsis.

Visi gijos arba gijų telkinio naudojami ištekliai automatiškai išvalomi, kai iškviečiamas naikintuvas. Bet juos galima išvalyti priverstinai, iškviečiant metodą Išvalyti. Tokiu atveju sriegio / baseino naudoti nebegalima.

At standartiniai nustatymai gija inicijuojama iš anksto, iškart, kai sukuriama klasė. Jei nustatysite parametrą prieššakisį false, tada šakutė įvyks tik tuo metu, kai bus paleista užduotis.

Apskritai, yra gana daug pritaikomų parametrų. Vaiko proceso pavadinimo keitimas po šakutės (parametras pVardas konstruktorius), skirtasis laikas užduoties trukmei ( timeoutWork), skirtasis laikas – maksimalus laikas, kurį antrinis procesas gali laukti užduočių ( timeoutMaxWait), skirtasis išankstinio inicijavimo laikas ( timeoutInit), lizdo skaitymo buferio dydžiai ( pipeReadSize, pipeMasterReadSize).
Galite išjungti kelių užduočių režimą gijomis ( daugiafunkcinis darbas). Tokiu atveju kiekvieną kartą, kai užduotis bus baigta, antrinis procesas užges ir vėl pradės veikti kitam paleidimui. Tai pastebimai sumažins našumą.

Kodas yra padengtas testais ir išsamiai dokumentuotas; naudojimo pavyzdžius galima peržiūrėti ir paleisti faile pavyzdys.php.
Daugiau sudėtingų pavyzdžių su klaidų tvarkymu galima pamatyti įrenginio testo kode.

Yra derinimo režimas, kuriame labai Detali informacija apie tai, kas tiksliai vyksta ir kur.

Naudojimo pavyzdžiai

Pagrindinis bruožas yra maksimalus paprastumas. Jei tiesiog norite ką nors paleisti atskiroje "gijoje", pakanka šio kodo:
class PavyzdysThread pratęsia Thread ( apsaugota funkcija process() ( // Kai kurie darbai čia ) ) $thread = new ExampleThread(); $thread->wait()->run();
Jei yra viskas, ko reikia visaverčiam darbui, tada užduotis bus atlikta asinchroniškai. Jei ne, tada viskas vis tiek veiks, bet sinchroniniu režimu.

Perdavus parametrą ir gavus rezultatą, kodas atrodys šiek tiek sudėtingesnis:
class PavyzdysThread pratęsia Thread ( Protected function process() ( return $this->getParam(0); ) ) $thread = new ExampleThread(); $thread->wait()->run(123); $rezultatas = $thread->wait()->getResult();

Panašiai, šiek tiek mostelėdami ranka, pridedame įvykių apdorojimą iš srauto:
class PavyzdysThread pratęsia giją ( const EV_PROCESS = "procesas"; apsaugota funkcija process() ( $events = $this->getParam(0); for ($i = 0; $i< $events; $i++) { $event_data = $i; $this->trigger(self::EV_PROCESS, $event_data); ) ) ) // Papildomas argumentas. $papildomas argumentas = 123; $thread->bind(ExampleThread::EV_PROCESS, function($įvykio_pavadinimas, $įvykio_duomenys, $additional_arg) ( // įvykio apdorojimas), $additionalArgument); $įvykiai = 10; // įvykių, kuriuos sugeneruos gija, skaičius // Kad nereikėtų rankiniu būdu laukti gijos prieš pirmą iškvietimą, // galite perrašyti preforkWait ypatybę į TRUE palikuonių klasėje $thread->wait(); $thread = naujas PavyzdysThread(); $thread->run($events)->wait();

Galiausiai, naudojant aštuonių gijų telkinį su vykdymo laiko klaidų tvarkymu:
$threads = 8 // Gijų skaičius $pool = new ThreadPool("ExampleThread", $threads); $num = 25; // Užduočių skaičius $left = $num; // Likusių užduočių skaičius ( // Jei telkinyje yra laisvų gijų // Ir dar turime vykdyti užduočių, kol ($pool->hasWaiting() && $left > 0) ( // Pradėdami gauname gijos ID $threadId = $pool->run(); $left--; ) if ($results = $pool->wait($nepavyko)) ( foreach ($results kaip $threadId => $result) ( / / Sėkmingai atlikta užduotis // Rezultatą galima atpažinti // pagal gijos ID ($threadId) $num--; ) ) if ($nepavyko) ( // Tvarkyti vykdymo klaidas. // Darbas laikomas nesėkmingai užbaigtu // jei antrinis procesas mirė vykdymo metu arba // baigėsi užduočių vykdymo laikas foreach ($failed as $threadId) ( $left++; ) ) ) while ($num > 0); // Nutraukti visus antrinius procesus. Išvalome baseino naudojamus išteklius. $baseinas->valymas();

Veikimo testo rezultatai

Bandymus atlikau dviejuose kompiuteriuose su Ubuntu 11.04.
Pirmasis yra Intel Core i3 540 3,07 GHz
Antrasis yra „Intel Core i7 2600K 3,40 Ghz“ („Ubuntu“ veikia „VMware“ virtualioje mašinoje)

Rezultatus pateikiu tiesiog tam, kad galėtumėte įvertinti produktyvumo padidėjimą.
Vėlgi, tai yra vidutiniai 10 testų pakartojimų serijos rezultatai JPS (darbų per sekundę – užduočių skaičius per sekundę).

Kaip užduotį gijos atlieka šias šiukšles:
už ($i = 0; $i< 1000; $i++) { $r = mt_rand(0, PHP_INT_MAX) * mt_rand(0, PHP_INT_MAX); }
Pirmasis rezultatas nurodomas sinchroniniam darbo režimui (be šakių).
Pirmoje konfigūracijoje nebandžiau 18 ir 20 gijų, nes jau 12 našumas pradėjo kristi.

Siūlų skaičius Pirmoji konfigūracija Antra
0 553 763
1 330 669
2 580 1254
4 1015 2188
8 1040 2618
10 1027 2719
12 970 2739
16 958 2904
18 - 2830
20 - 2730

Tai yra, našumas padidėja 2–4 ​​kartus ar daugiau, priklausomai nuo procesoriaus!

Kodas, kuris atlieka bandymų seriją su reikalingais parametrais, yra faile pavyzdžiai/speed_test.php. Taigi galite lengvai išbandyti našumą ir pasirinkti sau optimalų siūlų skaičių.

Žiniatinklyje yra daugybė sprendimų, skirtų emuliuoti daugiagiją PHP. Dažniausiai jie yra pagrįsti šakėmis, tačiau yra ir temos variantų garbanoti, proc_open ir taip toliau.

Visi variantai, su kuriais susidūriau, man dėl vienokių ar kitokių priežasčių netiko, todėl turėjau parašyti savo sprendimą. Turėjau šiuos reikalavimus:

  • Šakių naudojimas;
  • Sinchroninis režimas su sąsajos išsaugojimu, jei nėra reikiamų plėtinių;
  • Vaikų procesų pakartotinis naudojimas;
  • Pilnas duomenų apsikeitimas tarp procesų. Tie. paleiskite argumentus ir gaukite rezultatą, kai baigsite;
  • Gebėjimas keistis įvykiais tarp vaikiško „siūlo“ proceso ir pagrindinio proceso veikimo metu;
  • Darbas su gijų telkiniu išlaikant pakartotinį naudojimą, perduodant argumentus ir siekiant rezultatų;
  • Vykdymo laiko klaidų tvarkymas;
  • Darbo atlikimo laikas, darbo laukimas pagal siūlą, inicijavimas;
  • Maksimalus našumas.

Rezultatas buvo AzaThread biblioteka (anksčiau CThread).

apibūdinimas

AzaThread suteikia paprastą sąsają gijų klasėms kurti. Kurie iš tikrųjų naudoja atskirus procesus, kad veiktų asinchroniškai, bet jums tai neturėtų rūpėti. Galite siųsti įvykius iš gijos, grąžinti rezultatus, naudoti vieną giją kelis kartus, pateikdami jai paleidimo argumentus arba sukurti 16 gijų telkinį, kuris atlieka jūsų užduotis, pavyzdžiui, karštus pyragus, nekreipdami dėmesio į tai, kad darbas vyksta. skirtinguose procesuose.

Be to, galite lengvai išbandyti bibliotekos veikimą įvairiais režimais, pasirinkdami optimalų gijų skaičių ir duomenų perdavimo tarp procesų parinktį specialiai jūsų konfigūracijai.

Norint visapusiškai veikti, reikalingi šie plėtiniai: gyvas, pozix Ir pcntl.

Ryšiui tarp procesų biblioteka naudoja LibEvent ir suporuotus lizdus. Palaiko 5 duomenų perdavimo parinktis (argumentus, rezultatus ir įvykių duomenis)!

Iš karto pateikiu parinktis su veiklos duomenimis. Išbandyta naudojant aštuonių gijų telkinį Intel Core i7 2600K 3,40 GHz (Ubuntu 11.04 virtualioje mašinoje VMware). Pateikiami vidutiniai 10 testo pakartojimų rezultatai jps formatu (darbų per sekundę – užduočių skaičius tiesiog gaunant argumentus ir siunčiant duomenis per sekundę).

Automatiškai pasirenkamas darbo su lizdais plėtinys. Jei yra, naudojamas plėtinys lizdai, kuris pagerina našumą. Priešingu atveju jis bus naudojamas srautas.

Vaiko procesas klausosi visų galimų signalų. Pagal numatytuosius nustatymus visi jie (išskyrus SIGWINCH ir SIGINFO) yra išjungiami. Bet tai gali būti lengvai nepaisoma sukuriant metodą gijų klasėje su signalo pavadinimu. Pavyzdžiui, sigWinch.

Pirminiame procese visi signalai taip pat perimami pagal numatytuosius nustatymus. Tai galima pakeisti nustatant klasės parametrą listenMasterSignals į false . Tokiu atveju bus apdorojamas tik SIGCHLD. Galite lengvai pridėti savo tvarkykles sukurdami statinį metodą, vadinamą m<имя сигнала>. Pavyzdžiui, mSigTerm.

Jei antrinis procesas dėl kokios nors priežasties miršta, klasė automatiškai išsišakos, kai bus paleista nauja užduotis. Tai nutinka nepastebimai ir jums visai nereikia apie tai galvoti. Atsiradus klaidai egzemplioriaus tiesiog nereikia sukurti iš naujo.

Vaikų procesas periodiškai tikrina, ar yra pirminis procesas. Jei jis staiga miršta, vaikas automatiškai baigsis.

Visi gijos arba gijų telkinio naudojami ištekliai automatiškai išvalomi, kai iškviečiamas naikintuvas. Bet juos galima išvalyti priverstinai, vadinant valymo metodą. Tokiu atveju sriegio / baseino naudoti nebegalima.

Standartiniais nustatymais gija inicijuojama iš anksto, iškart sukūrus klasę. Jei nustatysite parametrą prefork į false , tada šakutė įvyks tik tuo metu, kai bus paleista užduotis.

Apskritai, yra gana daug pritaikomų parametrų. Antrinio proceso pavadinimo keitimas po šakės (parametras pName of the konstruktor), skirtasis laikas užduoties vykdymo trukmei (timeoutWork), skirtasis laikas maksimaliam laikui, kurį antrinis procesas laukia užduočių (timeoutMaxWait), skirtasis laikas išankstiniam inicijavimo laikas (timeoutInit), skaitymo lizdų buferių dydis (pipeReadSize , pipeMasterReadSize). Galite išjungti gijų kelių užduočių režimą (multitask). Tokiu atveju kiekvieną kartą, kai užduotis bus baigta, antrinis procesas užges ir vėl pradės veikti kitam paleidimui. Tai pastebimai sumažins našumą.

Kodas yra padengtas testais ir išsamiai dokumentuotas; naudojimo pavyzdžius galima peržiūrėti ir paleisti faile example.php. Sudėtingesni klaidų valdymo pavyzdžiai gali būti matomi vieneto testo kode.

Yra derinimo režimas, kuriame rodoma labai išsami informacija apie tai, kas tiksliai vyksta ir kur.

Naudojimo pavyzdžiai

Pagrindinis bruožas yra maksimalus paprastumas. Jei tiesiog norite ką nors paleisti atskiroje "gijoje", pakanka šio kodo:

Klasė PavyzdysThread pratęsia Thread ( apsaugota funkcija process() ( // Kai kurie darbai čia ) ) $thread = new ExampleThread(); $thread->wait()->run();

Jei yra viskas, ko reikia visaverčiam darbui, tada užduotis bus atlikta asinchroniškai. Jei ne, tada viskas vis tiek veiks, bet sinchroniniu režimu.

Perdavus parametrą ir gavus rezultatą, kodas atrodys šiek tiek sudėtingesnis:

Klasė PavyzdysThread pratęsia Thread ( Protected function process() ( return $this->getParam(0); ) ) $thread = new ExampleThread(); $thread->wait()->run(123); $rezultatas = $thread->wait()->getResult();

Panašiai, šiek tiek mostelėdami ranka, pridedame įvykių apdorojimą iš srauto:

Klasės pavyzdysThread pratęsia giją ( const EV_PROCESS = "procesas"; apsaugotos funkcijos procesas() ( $events = $this->getParam(0); for ($i = 0; $i trigger(self::EV_PROCESS, $event_data); ) ) ) // Papildomas argumentas. $papildomas argumentas = 123; $thread->bind(ExampleThread::EV_PROCESS, function($įvykio_pavadinimas, $įvykio_duomenys, $additional_arg) ( // įvykio apdorojimas), $additionalArgument); $įvykiai = 10; // įvykių, kuriuos sugeneruos gija, skaičius // Kad nereikėtų rankiniu būdu laukti gijos prieš pirmą iškvietimą, // galite perrašyti preforkWait ypatybę į TRUE palikuonių klasėje $thread->wait(); $thread = naujas pavyzdysThread(); $thread->run($events)->wait();

Galiausiai, naudojant aštuonių gijų telkinį su vykdymo laiko klaidų tvarkymu:

$threads = 8 // Gijų skaičius $pool = new ThreadPool("ExampleThread", $threads); $num = 25; // Užduočių skaičius $left = $num; // Likusių užduočių skaičius ( // Jei telkinyje yra laisvų gijų // Ir dar turime vykdyti užduočių, kol ($pool->hasWaiting() && $left > 0) ( // Pradėdami gauname gijos ID $threadId = $pool->run(); $left--; ) if ($results = $pool->wait($nepavyko)) ( foreach ($results kaip $threadId => $result) ( / / Sėkmingai atlikta užduotis // Rezultatą galima atpažinti // pagal gijos ID ($threadId) $num--; ) ) if ($nepavyko) ( // Tvarkyti vykdymo klaidas. // Darbas laikomas nesėkmingai užbaigtu // jei antrinis procesas mirė vykdymo metu arba // baigėsi užduočių vykdymo laikas foreach ($failed as $threadId) ( $left++; ) ) ) while ($num > 0); // Nutraukti visus antrinius procesus. Išvalome baseino naudojamus išteklius. $baseinas->valymas();

Veikimo testo rezultatai

Bandymus atlikau dviejuose kompiuteriuose su Ubuntu 11.04.
Pirmasis yra Intel Core i3 540 3,07 GHz.
Antrasis yra Intel Core i7 2600K 3,40 Ghz (Ubuntu veikia VMware virtualioje mašinoje).

Rezultatus pateikiu tiesiog tam, kad galėtumėte įvertinti produktyvumo padidėjimą. Vėlgi, tai yra vidutiniai 10 testo pakartojimų serijos rezultatai JPS (darbų per sekundę – užduočių skaičius per sekundę).

Kaip užduotį gijos atlieka šias šiukšles:

Jei ($i = 0; $i

Pirmasis rezultatas nurodomas sinchroniniam darbo režimui (be šakių). Pirmoje konfigūracijoje nebandžiau 18 ir 20 gijų, nes jau 12 našumas pradėjo kristi.

Siūlų skaičius Pirmoji konfigūracija Antra
0 553 763
1 330 669
2 580 1254
4 1015 2188
8 1040 2618
10 1027 2719
12 970 2739
16 958 2904
18 - 2830
20 - 2730

Tai yra, našumas padidėja 2–4 ​​kartus ar daugiau, priklausomai nuo procesoriaus!

Kodas, kuris atlieka bandymų seriją su reikalingais parametrais, yra faile examples/speed_test.php. Taigi galite lengvai išbandyti našumą ir pasirinkti sau optimalų siūlų skaičių.

Labai džiaugsiuosi, jei biblioteka kam nors pravers. Bet kokias funkcijų užklausas ar aptiktas klaidas galima palikti „Github“, aš greitai pataisysiu ir patobulinsiu biblioteką.

Atrodo, kad PHP kūrėjai retai naudoja lygiagretumą. Nekalbėsiu apie sinchroninio kodo paprastumą; vienos gijos programavimas, žinoma, yra paprastesnis ir aiškesnis, tačiau kartais šiek tiek paralelizmo panaudojimas gali žymiai padidinti našumą.

Šiame straipsnyje pažvelgsime į tai, kaip PHP galima pasiekti kelių gijų naudojant plėtinį pthreads. Tam reikės įdiegti PHP 7.x ZTS (Zend Thread Safety) versiją kartu su įdiegtu pthreads v3 plėtiniu. (Rašymo metu PHP 7.1 naudotojai turės įdiegti iš pagrindinės šakos pthreads saugykloje – žr. trečiosios šalies plėtinį.)

Mažas paaiškinimas: pthreads v2 yra skirtas PHP 5.x ir nebepalaikomas, pthreads v3 skirtas PHP 7.x ir yra aktyviai kuriamas.

Po tokio nukrypimo eikime tiesiai prie reikalo!

Vienkartinių užduočių apdorojimas

Kartais norite apdoroti vienkartines užduotis kelių gijų būdu (pavyzdžiui, atlikti tam tikrą įvesties / išvesties užduotį). Tokiais atvejais galite naudoti klasę Thread, kad sukurtumėte naują giją ir atliktumėte apdorojimą atskiroje gijoje.

Pavyzdžiui:

$task = nauja klasė išplečia giją ( privatus $ atsakymas; viešoji funkcija run() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $turinys, $atitinka); $this->response = $atitinka; ) ); $užduotis->start() && $task->join(); var_dump($užduotis->atsakymas); // eilutė (6) „Google“

Čia paleidimo metodas yra mūsų apdorojimas, kuris bus vykdomas naujoje gijoje. Kai iškviečiama Thread::start, sukuriama nauja gija ir iškviečiamas vykdymo metodas. Tada antrinę giją sujungiame atgal prie pagrindinės gijos, iškviesdami Thread::join , kuri bus blokuojama, kol antrinė gija bus baigta vykdyti. Tai užtikrina, kad užduotis bus baigta vykdyti prieš bandant išspausdinti rezultatą (kuris saugomas $task->response).

Gali būti nepageidautina užteršti klasę papildomomis pareigomis, susijusiomis su srauto logika (įskaitant atsakomybę už paleidimo metodo apibrėžimą). Tokias klases galime atskirti paveldėdami jas iš Threaded klasės. Tada jie gali būti paleisti kitoje gijoje:

Klasės užduotis išplečia giją (vieša $atsakymas; viešoji funkcija someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $matches); $ this->response = $atitinka; ) ) $užduotis = nauja užduotis; $thread = new class($task) pratęsia Thread ( privati ​​$užduotis; viešoji funkcija __construct(Threaded $task) ( $this->task = $task; ) public function run() ( $this->task->someWork( ; ) ); $gija->pradžia() && $gija->prisijungti(); var_dump($užduotis->atsakymas);

Bet kuri klasė, kurią reikia paleisti atskiroje gijoje privalo paveldėti iš Threaded klasės. Taip yra todėl, kad ji suteikia reikiamas galimybes apdoroti įvairias gijas, taip pat numanomą saugumą ir naudingas sąsajas (pvz., išteklių sinchronizavimą).

Pažvelkime į klasės hierarchiją, kurią siūlo pthreads plėtinys:

Threaded (įgyvendina Traversable, Collectable) Thread Worker Volatile Pool

Mes jau apžvelgėme ir išmokome „Thread“ ir „Treaded“ klasių pagrindus, o dabar pažvelkime į kitas tris („Worker“, „Labai“ ir „Pool“).

Pakartotinis gijų naudojimas

Pradėti naują giją kiekvienai užduočiai, kurią reikia sulyginti, yra gana brangu. Taip yra todėl, kad pthreaduose turi būti įdiegta bendra-nieko architektūra, kad būtų pasiektas daugiagijas PHP. Tai reiškia, kad visas dabartinio PHP interpretatoriaus egzemplioriaus vykdymo kontekstas (įskaitant kiekvieną klasę, sąsają, bruožą ir funkciją) turi būti nukopijuotas kiekvienai sukurtai gijai. Kadangi tai turi pastebimą poveikį našumui, srautas visada turėtų būti naudojamas pakartotinai, kai tik įmanoma. Gijas galima pakartotinai naudoti dviem būdais: naudojant Workers arba baseinus.

Darbuotojų klasė naudojama sinchroniškai atlikti daugybę užduočių kitoje gijoje. Tai atliekama sukuriant naują Worker egzempliorių (kuris sukuria naują giją) ir perkeliant užduotis į tos atskiros gijos krūvą (naudojant Worker::stack).

Štai mažas pavyzdys:

Klasės užduotis išplečia Threaded (privati ​​$value; viešoji funkcija __construct(int $i) ( $this->value = $i; ) viešoji funkcija run() (usleep(250000); echo "Task: ($this->value) \n"; ) ) $darbuotojas = naujas darbuotojas(); $darbininkas->pradėti(); for ($i = 0; $i stack(new Task($i)); ) while ($worker->collect()); $darbininkas->išjungimas();

Aukščiau pateiktame pavyzdyje 15 užduočių, skirtų naujam $worker objektui, perkeliamos į krūvą naudojant Worker::stack metodą, o tada apdorojamos tokia tvarka, kokia buvo nustumtos. Metodas Worker::collect, kaip parodyta aukščiau, naudojamas užduotims išvalyti, kai tik jos baigiasi vykdyti. Su juo, tam tikro ciklo viduje, užblokuojame pagrindinę giją, kol bus baigtos ir išvalytos visos krūvoje esančios užduotys – prieš tai iškviečiame Worker::shutdown . Anksti nutraukus darbuotojo darbą (t. y. kol dar yra užduočių, kurias reikia atlikti), pagrindinė gija vis tiek bus užblokuota, kol visos užduotys bus baigtos vykdyti, tik todėl, kad užduotys nebus renkamos šiukšlės (tai reiškia, kad yra atminties nutekėjimo).

Darbuotojų klasėje pateikiami keli kiti metodai, susiję su jos užduočių krūva, įskaitant Worker::unstack, skirtą pašalinti paskutinę sukrautą užduotį, ir Worker::getStacked, kad gautų užduočių skaičių vykdymo krūvoje. Darbuotojo krūvoje yra tik tos užduotys, kurias reikia atlikti. Atlikus rietuvėje esančią užduotį, ji pašalinama ir dedama į atskirą (vidinį) krūvą šiukšlėms surinkti (naudojant Worker::collect metodą).

Kitas būdas pakartotinai panaudoti giją kelioms užduotims yra naudoti gijų telkinį (per „Pool“ klasę). Gijų telkinys naudoja darbuotojų grupę, kad būtų galima vykdyti užduotis tuo pačiu metu, kuriame sukūrus telkinį nustatomas lygiagretumo koeficientas (grupės gijų, su kuriomis jis veikia, skaičius).

Aukščiau pateiktą pavyzdį pritaikykime darbuotojų grupei:

Klasės užduotis išplečia Threaded (privati ​​$value; viešoji funkcija __construct(int $i) ( $this->value = $i; ) viešoji funkcija run() (usleep(250000); echo "Task: ($this->value) \n"; ) ) $pulas = naujas baseinas(4); for ($i = 0; $i submit(new Task($i)); ) while ($pool->collect()); $pool->shutdown();

Naudojant baseiną, o ne su darbuotoju, yra keletas pastebimų skirtumų. Pirma, telkinio nereikia paleisti rankiniu būdu; jis pradeda vykdyti užduotis, kai tik jos atsiranda. Antra, mes siųsti užduotis į baseiną, o ne sudėkite juos ant krūvos. Be to, „Pool“ klasė nepaveldi iš „Threaded“ ir todėl negali būti perduota kitoms gijomis (skirtingai nei „Worker“).

Kaip gera praktika Darbuotojams ir grupėms visada turėtumėte išvalyti jų užduotis, kai tik jie baigia, ir patys jas nutraukti rankiniu būdu. Gijos, sukurtos naudojant gijų klasę, taip pat turi būti prijungtos prie pagrindinės gijos.

pgijos ir (ne)kintamumas

Paskutinė klasė, kurią paliesime, yra Volatile, naujas pthreads v3 priedas. Nekintamumas tapo svarbia sąvoka pgijose, nes be jo našumas labai nukenčia. Todėl pagal numatytuosius nustatymus Threaded klasių, kurios pačios yra Threaded objektai, savybės dabar yra nekintamos, todėl jų negalima perrašyti po pradinio priskyrimo. Šiuo metu pirmenybė teikiama aiškaus tokių savybių keitimui, kurį vis tiek galima pasiekti naudojant naują lakiųjų klasę.

Pažvelkime į pavyzdį, kuris parodys naujus nekintamumo apribojimus:

Klasės užduotis išplečia Threaded // Threaded klasę (viešoji funkcija __construct() ( $this->data = new Threaded(); // $this->duomenys nėra perrašomi, nes tai yra Threaded klasės sriegių savybė)) $task = new class(new Task()) pratęsia giją ( // sriegiuota klasė, nes Thread išplečia gijų viešąją funkciją __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> data); // object(Threaded)#3 (0) () $this->threadedMember = new StdClass(); // negalioja, nes ypatybė yra Threaded klasės Threaded narys ) );

Kita vertus, lakiųjų klasių srieginės savybės yra keičiamos:

Klasės užduotis išplečia Volatile (viešoji funkcija __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // galioja, nes esame nepastovioje klasėje ) ) $task = new class(new Task()) pratęsia giją (viešoji funkcija __construct($vm) ( $this->volatileMember = $vm; var_dump($this->volatileMember->data); // object(stdClass)#4 (0) () // vis dar negalioja, nes Volatile išplečia Threaded, taigi nuosavybė vis dar yra Threaded klasės Threaded narys $this->volatileMember = new StdClass(); ) );

Matome, kad nepastovi klasė nepaiso nekintamumo, kurį nustato jos pirminė Threaded klasė, kad suteiktų galimybę pakeisti gijų savybes (taip pat jas atšaukti ()).

Yra dar vienas diskusijų objektas, skirtas kintamumo ir nepastovios klasės temai – masyvai. Pthreaduose masyvai automatiškai perduodami į nepastovius objektus, kai jie priskiriami Threaded klasės ypatybei. Taip yra todėl, kad tiesiog nesaugu manipuliuoti kelių PHP kontekstų masyve.

Dar kartą pažvelkime į pavyzdį, kad geriau suprastume kai kuriuos dalykus:

$masyvas = ; $task = new class($masyvas) pratęsia giją ( privatūs $duomenys; viešoji funkcija __construct(masyvas $masyvas) ( $this->data = $masyvas; ) viešoji funkcija run() ( $this->data = 4; $ tai->duomenys = 5; print_r($this->data); ) ); $užduotis->pradėti() && $užduotis->prisijungti(); /* Išvestis: nepastovus objektas ( => 1 => 2 => 3 => 4 => 5) */

Matome, kad nepastovius objektus galima traktuoti taip, lyg jie būtų masyvai, nes jie palaiko masyvo operacijas, tokias kaip (kaip parodyta aukščiau) operatorius subset(). Tačiau Volatile klasės nepalaiko pagrindinių masyvo funkcijų, tokių kaip array_pop ir array_shift. Vietoj to, Threaded klasė suteikia mums tokias operacijas kaip įtaisytuosius metodus.

Kaip demonstracija:

$duomenys = nauja klasė išplečiama nepastovi (vieša $a = 1; vieša $b = 2; vieša $c = 3; ); var_dump($duomenys); var_dump($duomenys->pop()); var_dump($duomenys->shift()); var_dump($duomenys); /* Išvestis: object(class@anonymous)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) object(class@anonymous)#1 (1) ( ["b"]=> int(2) ) */

Kitos palaikomos operacijos apima Threaded::chunk ir Threaded::merge .

Sinchronizavimas

Paskutiniame šio straipsnio skyriuje apžvelgsime sinchronizavimą pthreaduose. Sinchronizavimas yra metodas, leidžiantis valdyti prieigą prie bendrinamų išteklių.

Pavyzdžiui, įgyvendinkime paprastą skaitiklį:

$skaitiklis = new class pratęsia giją ( public $i = 0; public function run() ( for ($i = 0; $i i; ) ) ); $skaitiklis->pradėti(); for ($i = 0; $i i; ) $counter->join(); var_dump($skaitiklis->i); // išspausdins skaičių nuo 10 iki 20

Nenaudojant sinchronizavimo, išvestis nėra deterministinė. Kelios gijos rašo į tą patį kintamąjį be kontroliuojamos prieigos, o tai reiškia, kad naujinimai bus prarasti.

Pataisykime tai taip, kad gautume teisingą 20 išvestį pridėdami laiką:

$skaitiklis = new class extens Thread ( public $i = 0; public function run() ( $this->synchronized(function () ( for ($i = 0; $i i; ) )); ) ); $skaitiklis->pradėti(); $skaitiklis->sinchronizuotas(funkcija ($skaitiklis) ( for ($i = 0; $i i; ) ), $skaitiklis); $skaitiklis->prisijungti(); var_dump($skaitiklis->i); // int(20)

Sinchronizuoti kodo blokai taip pat gali bendrauti tarpusavyje naudodami Threaded::wait ir Threaded::notify (arba Threaded::notifyAll) metodus.

Čia yra alternatyvus dviejų sinchronizuotų ciklų padidėjimas:

$skaitiklis = new class praplečia giją ( public $cond = 1; public function run() ( $this->synchronized(function ()) ( for ($i = 0; $i notify();); if ($this->cond === 1) ( $this->cond = 2; $this->palaukite(); ) ) )); ) ); $skaitiklis->pradėti(); $skaitiklis->sinchronizuotas(funkcija ($skaitiklis) ( if ($counter->cond !== 2) ( $counter->wait(); // laukti kitas pradėti pirmiausia ) for ($i = 10; $i notify(); if ($counter->cond === 2) ( $counter->cond = 1; $counter->wait(); ) ) ) , $skaitiklis); $skaitiklis->prisijungti(); /* Išvestis: int(0) int(10) int(1) int(11) int(2) int(12) int(3) int(13) int(4) int(14) int(5) int( 15) int(6) int(16) int(7) int(17) int(8) int(18) int(9) int(19) */

Galite pastebėti papildomos sąlygos, kurios buvo aplink skambutį Threaded::wait . Šios sąlygos yra labai svarbios, nes leidžia sinchronizuotam atgaliniam skambučiui atnaujinti, kai gaunamas pranešimas ir nurodyta sąlyga yra teisinga. Tai svarbu, nes pranešimai gali būti gaunami iš kitų vietų, nei tada, kai iškviečiama Threaded::notify. Taigi, jei iškvietimai į Threaded::wait metodą nebuvo įtraukti į sąlygas, mes vykdysime melagingi pažadinimo skambučiai, o tai lems nenuspėjamą kodo elgesį.

Išvada

Pažiūrėjome į penkias pthreads paketo klases (Threaded, Thread, Worker, Volatile ir Pool) ir kaip naudojama kiekviena klasė. Mes taip pat pažvelgėme į naują nekintamumo sampratą pgijose trumpa apžvalga palaikomos sinchronizavimo galimybės. Turėdami šiuos pagrindus, dabar galime pradėti ieškoti, kaip pthreads gali būti naudojamos realiame pasaulyje! Tai bus kito mūsų įrašo tema.

Jei jus domina kito įrašo vertimas, praneškite man: komentuokite socialiniuose tinkluose. tinklus, balsuokite ir pasidalykite įrašu su kolegomis ir draugais.

Įkeliama...Įkeliama...