Tudd Intuíció, előadás patakok

Monitorok és szemaforokat. Dining filozófusok.

Lock kritikus szakaszok képes megbirkózni a problémával adatok versenyen. Ahogy blokkoló szerek, figyelembe vettük az üzemeltető zárja le a C # nyelvet. De a keret. Net tartalmaz több osztály, amely lehetővé teszi, hogy szervezzen egy zárat. A rengeteg különféle eszközt egy probléma megoldására gyakran azt jelzi, hogy az egyetemes orvosság, alkalmas minden alkalommal hiányzik.

lock operátor valójában épül a Monitor osztály. rekord:

Meg lehet tekinteni, mint a rövid formában az alábbi bejegyzéseket:

Adjon meg egy statikus módszer osztályú Monitor fedi kritikus szakasz, merített egy próbát -blokk, referencia objektum szekrény. A szemantika megegyezik az üzemeltető zár. Minden más szálak megpróbál belépni a kritikus szakaszba, a privát kulcs szekrény. Ők sorakoznak a sorban, várva a szakasz nem kerül nyilvánosságra. Az elvégzett bármely próbálja -block a véglegesen blokkolni. Ez kinyitja.

A Monitor osztály, vannak más módszerek, hogy szervezzen egy zárat. Egyes források, valamint néhány emberek utálják a hosszú várakozási a sorban. Ilyen helyzetekben, akkor inkább, hogy kilépjen a feladatot, vagy próbálja, hogy jöjjön vissza egy másik alkalommal, talán a sorban nem. Az ilyen áramlások Monitor osztály biztosítja TryEnter módszer. amely a következő szintaxist:

Osztályba Monitor három fontos módszerek - Várj. Pulse. PulseAll. Ezeket a módszereket nevezzük a kritikus szakasz. Vannak összekötve, és lehetővé teszik két vagy több szálat szinkronizálni munkájukat küldött egy értesítést, hogy egymással.

Tegyük fel, kövesse az alábbi lépéseket a kritikus szakaszban, a szál felfedezi, hogy egy másik szál, hogy végre valami feldolgozás zárt forrás. Ebben a helyzetben a menet kellene függesztenie a munka, szabadidő forrásokat, hogy egy másik téma, hogy elvégzi a szükséges feldolgozás, majd értesíti a felfüggesztett szál, hogy ő továbbra is működik. Várj technikák - Pulse lehetővé teszi, hogy hajtsák végre a leírt forgatókönyv. Várja a módszer lehetővé teszi, hogy függessze fel a munkafolyamat egy kritikus szakaszban. Pulse módszer értesítést küld, amely lehetővé teszi a felfüggesztett szál tovább fut. PulseAll módszer lehetővé teszi, hogy továbbra is a végrehajtása során felfüggesztett szálat.

Várjon egy túlterhelt metódus, és úgy véljük, csak az alap változat, amely a következő szintaxist:

Obj paraméter határozza meg a szinkronizációs objektum, amely a kritikus szakasz. Az eljárás jellemzően nem használja a visszatérési érték, és az okozza az üzemeltető, és nem függvényében. A pontos szemantikáját módszer a következő. Módszer közlemény egy órát tárgy megszakítja az áramlást, és lesz egy különleges helyet várakozási értesítést. Ha egy másik módszer lefoglalt kiadott egy szinkronizációs objektum végzi Pulse módszer. Az első módszer a várakozási sorban átvisszük egy sorban feldolgozásra kész folyamok. Ha ez a fordulat a módszer végzünk, akkor visszanyeri állapotát visszaállítja minden előzetes zár és az eljárás folytatódik.

Pulse módszer a következő szintaxist:

Ha a módszer bejelentett összes várakozó szálak szinkronizálással tárgy obj. Ennek eredményeként, az áramlás a sorban mozog az állami állás. Amikor a menet, amely miatt az eljárás Pulse. Felszabadítja a zár, akkor készen áll, hogy továbbra is az áramlás a végrehajtás.

Együttműködési módszerek Várj - Pulse lehetővé teszi számunkra, hogy megoldja sok probléma a kölcsönhatás flow nem lehet megoldani más módon.

Mielőtt egy példát, amely bizonyítja a kölcsönhatás a hullámok, ismét elmondom a kemény frakció a programozók, akik létre párhuzamos programokat. Egy példa a módszerek alkalmazásának és Várjon Pulse hivatalos dokumentum megfelelően működik csak azzal a feltétellel, hogy a két futó szál fut egy első, egyébként van egy szegecs és alkalmazás lefagy. Amikor elkezdtem dolgozni egy alternatív projekt, akkor is volt valami baj előtt megszabadulni a visszatérő helyzet szegecs.

Példa az együttműködés a két áram várakozás- rendszer - Pulse

Tekintsük az együttműködés a két folyam példaként a következő probléma. Hagyja patakok kell feldolgozni a különböző adatok. Az első folyam volt a fő adatfeldolgozást, azzal a megkötéssel, hogy minden egyes eleme az adatok megfelel bizonyos követelményeknek. Ha ez a feltétel nem teljesül, akkor az áramlás működése felfüggesztésre, amely lehetővé teszi egy másik szál, hogy az adatokat el a kívánt állapotot, majd az első szál tudja folytatni a munkát.

Az egyszerűség kedvéért feltételezzük, hogy a készlet a feldolgozandó adatok - egy sor egészek. A kezelés maga redukálódik, hogy megtalálják a legnagyobb elem. Ebben az esetben a tömb elemeit meg kell felelniük a feltétellel, hogy mindegyikük nem kevesebb, mint 100. A második folyam helyettesíti a „kis” elemek értékei meghaladja a 100.

Itt van az osztály, amely elvégzi a kívánt array. Kezdjük egy általános leírást az osztály:

Mindkét anyagot fog dolgozni megosztott memória objektumok ebben az osztályban. Változó erőforrás - feldolgozzák tömb. Más változók az információcserét kölcsönható hullámok. Az osztály konstruktor és módszereket, tulajdonságok végre tipikus munkát nekik. Init eljárás lehetővé teszi, hogy az eredeti tömb kell feldolgozni.

Most adjunk a osztály módszer, amely végre az első adatfolyam, kiszámítjuk a maximális elemet, illetve felfüggeszti a munkát, ha a következő elem kevesebb, mint 100:

Megjegyzés: a csomó Monitor.Pulse és Monitor.Wait. - értesíti a másik szál, hogy tudott menni üzemkész állapotban van, és készenléti üzemmódba kapcsol. És itt van a kód egy másik szál korrigálására „kifogásolható” elemek:

Ha az első módszer elindul, készenléti üzemmódba kapcsol. Ellenkező esetben javít egy elemet, és hordozza egy csomó módszerek Pulse - Várj. Folytatáskor történik, hogy ellenőrizze a feltételeket, a befejezése a feldolgozási tömb. Ha az első szál befejezte munkáját, majd állítsa le a második folyam. Azt javasoljuk, gondosan vizsgálja meg a szerkezet a kölcsönhatás az áramlások, mert nem olyan egyszerű, mint amilyennek látszik első pillantásra.

Itt az eredmények egy alkalommal:


nagyobb kép
Ábra. 5.6. Az eredmények a kooperatív munka a két folyam

Egy másik módja, hogy egy zár szemaforokat. A szemafor két fontos jellemzői:

  • Szemaforok szigorúbbak, mint a hagyományos zár módszerekkel. Nincs szinkronizálás tárgy, és nem teszik lehetővé az áramlás egy kritikus szakasz, amikor van elfoglalva.
  • Szemaforok amelyek lágyabbak, mint a hagyományos zár módszerekkel. Ez lehetővé teszi, hogy adjon meg egy kritikus szakasz a több szálat.

Szemaforokat lehetővé teszi, hogy szimulálja a felvételi helyzet az ügyfelek a védett terület egy korlátozott számú helyek. Ilyenek például a helyeken, mint például a biztonságos parkoló, étterem, egy alvó autót. Ha minden ülés foglalt a parkolóban, hogy létrehoz egy sort, és adja meg a parkoló csak akkor lehetséges, miután az autó elhagyja a parkolóban.

Szemaforok gyakran használják a munkaszervezés és a szerver, amely lehetővé teszi, hogy csökkentsék a terhelést a szerver korlátozza az ügyfelek száma, ugyanakkor együttműködik a szerveren.

SemaphoreSlim osztály határozza meg a végrehajtását szemaforokkal. Az osztály két konstruktőrök. Az első kivitelező egy paraméter ami a kezdeti adatfolyamok száma, engedünk át ezen a szemafor. A működés során az operációs rendszer képes számának növelése megengedhető folyik. A második konstruktor második paraméter lehetővé teszi, hogy adja meg a maximális számú folyam, amely nem haladhatja meg. Szemaforokat gyakran használják a tolerancia módban csak egy szál.

Osztályba SemaphoreSlim két fő módszer - Várjon, és Release. Módszerek túlterhelt, de mi megelégszünk egy leírást végrehajtását ezeket a módszereket.

Hagyja meghatározott szemafor sem. n, amely lehetővé teszi az ügyfelek. Ezután minden egyes alkalommal, amikor hívást sem.Wait () az ügyfelek száma, amelyek számára engedélyezett belépés, akkor eggyel csökken. Amint ez a szám eléri a nullát, akkor keletkezik az összes kliens.

Release eljárás végrehajtja a fordított műveletet, növelve az ügyfelek száma lehetővé tette a készülék, amíg el nem éri a maximális értéket.

Mi lesz bizonyítani munkája szemaforokkal a példa a klasszikus probléma párhuzamos programozás - a problémát a „étkezési filozófusok”.

étkező filozófusok

A probléma az „étkezési filozófusok” által javasolt E. Dijkstra, jól mutatja a problémákat, amelyek egymással párhuzamosan, és különösen ismerős számunkra a problémát a szegecs. Kihagyva néhány művészi részleteket a problémát, és hozd be az alábbi feltételeket.

Öt filozófusok meghívott vacsorára. Ültek egy kerek asztal előtt mindegyikük egy tál spagettit, jobb az edény egy villával. Amint igaz filozófia, a vendégek nem enni, amennyit megengedhet magának spekuláció. Amikor a filozófus az élelmiszer emlékeztet, ő felveszi a villát, de hamarosan rájön, hogy van egy spagetti villa lehetetlen. Ha a szomszéd villa szabad, akkor vesz egy szomszéd villa és enni, míg újra nem merített gondolatot, felszabadítva a két villa. Ha a szomszéd villa foglalt, a filozófus várakozással a megjelenése, nem hagyta, hogy a villát.

Elemezzük ezt a problémát abból a szempontból párhuzamos programozás. Ebéd minden gondolkodó, egy külön folyamat, amely magában foglalja a három fázisból áll - gondolatok, elvárások és az élelmiszer. Minden folyamat párhuzamosan futnak. Megosztott erőforrások által használt eljárásban, villa. Minden folyamat két erőforrás. Mindegyik osztozik a szomszédos folyamatot. A vacsora alatt is megegyezik. Ha minden filozófusok mind akar menni az ételt, majd onnan az egyes csatlakozó, akkor bemegy tétlen állapotban van. Ez egy igazi filozófia, és soha többé nem mentesíti a dugót, lehetővé téve, hogy elég a szomszédja.

Mi jelenti a nehézséget végrehajtása egy ilyen feladat. Minden filozófus használja ugyanazt a módja az evés - ugyanazzal a módszerrel. Az egyetlen különbség a felhasznált források - villa, a paraméterként átadott módszerrel. Az élelmiszer, hogy garantálja a sikert a filozófus kell blokkolni a szükséges erőforrásokat. Azonban a javasolt módszerek nem teszik lehetővé a zár, hogy megakadályozza a források blokkolják a kritikus szakaszba - kód, amelyben az erőforrásokat használnak. Persze, könnyű lezárni a kód teljesen, és ezáltal gátolják a dugók. De ez egy rossz döntés, mert akkor minden alkalommal van egy spagetti csak egy filozófus, míg nem szegik meg a szabályokat, nem lehet egyszerre két filozófus, a 4 az 5 villa (általában vacsorázni egyidejűleg lehet N / 2 a filozófusok).

Hogyan kerüljük el a szegecs, anélkül, hogy megakadályozná a lehetőségét, vacsora összes többi filozófus? Az egyik lehetséges megoldás az, hogy a filozófusok a szolga, aki köteles biztosítani, hogy minden a filozófusok nem ugyanabban az időben kell kezdeni enni. Ha legalább egy dugó laza, akkor garantálja a szegecs.

A megoldás biztosítja, hogy nincs szegecs, egy másik stratégia - a stratégia, hogy racionalizálja a források felhasználását. Filozófusok könnyen képzett. Taníts még a filozófia (filozófusok páros szám) az első, hogy a villát a jobb oldalon, és furcsa az első filozófusok hogy a bal villát. Ez a megoldás kiküszöböli a szegecs. Sőt, úgy véljük, a két szomszédos filozófusok, akik mind úgy döntött. Balra közülük került a bal villát, a jobb - jobb. Fork között ingyenes, és kap egy filozófus (aki gyorsabban reagál). Az egyik pár filozófusok lesz a szomszédok várni kiadás villa. Áthatoló helyzet nem merül fel.

Egy ilyen megoldás gyakran használják a gyakorlatban. A városi területeken, ahol a forgalmi dugókat gyakran fordulnak elő, a páratlan napokon megengedett lovagolni gépek páratlan számok, még a napokban - a páros számok.

Mi folytassa az építőiparban a programozási modellt mi a probléma. Kezdjük egy általános leírást az osztály, szimulálva ebéd filozófusok:

Forks, ami a források, mint ami egy tömb osztály tárgyak SemaphoreSlim. Minden dugó - egyfajta szemafor számított, ne feledd, csak egy ügyfél. Ha fel van emelve, a másik filozófus, azt állítva, ezt a dugót meg kell várni. Filozófusok étvágyuk korlátozott, - ismétlés változó jelzi, hányszor filozófusok elkezd enni, hogy elég. államok tömb megőrzi a történelem az állam, amelyben voltak filozófusok során vacsora.

Most adjunk a mi osztály olyan módszert, amely inicializálja egyidejű folyamatok minden vacsora a filozófusok:

Minden a filozófus egy olyan folyamot. Minden szála párhuzamos végrehajtás. Az összes szál végezze el ugyanazt a módszert DinnerForFhilosophers. Induláskor metódus a paraméter, amely megadja, hogy hány filozófus.

DinnerForFhilosophers eljárás leírja magát ebéd folyamatot. Itt a kód:

Az elején a filozófus száma határozza meg, hogy a szükséges források. Ezután az erőforrás rendelés. Később a ciklus végeztük három szakaszban - gondolkodás, várjon, és enni. Amikor a filozófus veszi az első villa (left_fork.Wait), akkor készenléti állapotban van, és a dugó már nem érhetők el más filozófusok. Amikor filozófus vesz egy második csatlakozót (right_fork.Wait) bevételt az élelmiszer, és a dugó készül elérhetetlenné más filozófia. Végén étkezés két villa nem szabadulnak fel. A szabály bevezetése elrendelő befogó villa elkerüli a szegecs.

Nézzük a konzol projekt kódja Main eljárást. modellezés szerepe a gazda szervező ebéd filozófusok:

Egy mohó tulajdonosa, aki szenteli kis ebéd ideje, nem minden filozófus sikerül valamit enni, nem is beszélve arról,, enni:


Ábra. 5.8. éhes filozófusok

Kapcsolódó cikkek