A BADA programozási nyelv

Párhuzamosság

Párhuzamosság

Fontosabb osztályok és kapcsolataik

Runtime

Timer

Egy Timer segítségével meghatározott időközönként lefuttathatók bizonyos kódrészek. Ha egy Timer már egyszer tüzelt, nem fog újra aktivizálódni, csak ha ezt külön beállítjuk. Ez azt jelenti, hogy a Timer objektum, nem egy periodikus időzítő.

Időzítők nem használhatók dolgozó szálakban.

Amikor egy időzítő lejár, az ITimerEventListener::OnTimerExpired() eseménykezelő kerül meghívásra. A Timer újraindítható az eseménykezelőben, ezzel emulálva egy periodikus időzítőt. Például:

Periodic

Szinkronizációs objektumok

Mutex:
Kölcsönös kizárású (mutex) objektumok lehetővé teszik több szál számára egy közös használatú erőforrás kizárólagos elérését szálbiztos módon. A mutex lezár egy objektumot, hogy egy szálnak egyedüli elérést biztosítson. Azon szálak, amelyek szeretnék elérni a mutex-szel lezárt objektumot egy várakozási sorba kerülnek, amíg a zárfeloldásra nem kerül.
Szemafor:
Szemaforral vezérelhetjük, hogy egyszerre csak megadott számú szál férhessen hozzá egy erőforráshoz, és számon tarthatjuk, hogy éppen hányan kezelik a védett erőforrást.
Monitor:
Monitor segítségével zárolni lehet objektumokat, amíg inkonzisztens állapotban vannak. Monitorokat használva fellép a holtpont lehetősége. A monitorok támogatják a kölcsönös kizárást és a "wait and notify" technikát.

Mutex és szemafor

Műveletek:
Acquire():
Az erőforrás megszerzése, ha az szabad.
Release():
Az erőforrás elengedése.

Példa:

Példa

Monitorok

A monitorok lehetőséget adnak objektumokhoz való hozzáférés szinkronizálására (zárolására). Ennek érdekében, egy listában számon tartják az objektum elérésére várakozó szálakat.

Amikor egy szál zárolja az objektumot, azt nem érheti el másik szál mindaddig, amíg a zárfeloldásra nem kerül.

Azt a részt, ahol a közös erőforrás használata folyik, kritikus szakasznak nevezzük. Ezeket a szakaszokat fogják közre a monitor Enter() és Exit() metódusai.

Kritikus szakasz

A Wait(), Notify() és NotifyAll() utasítások csak a kritikus szakaszon belülről hívhatók.

Azon szálak, amelyek a monitoron belül vannak, átadhatják a futás jogát várakozó szálaknak értesítéssel. A várakozó szálak a legutolsó "Wait" pozíciótól folytatják futásukat.

  1. Az A szál megáll a "1) Do something" rész után, és értesítésig várakozik, amíg a B szál fut.
  2. A B szál befejezi a "2) Do something" részt, majd értesíti A-t. Ez elveszi a zárat a B-től és átruházza A-ra.
  3. Az A szál folytatja futását a "3) Do something" résszel.
Monitor

Szálkezelés

A szál az alapegysége a futásirányításnak egy programon belül. Egy egyszerű, szekvenciális kódrészlet futtatását jelenti a programban. Több szál több, egyidejű, konkurens kódfuttatást jelent.

Szál

Szálbiztosság

Ha több szál egyidejűleg használja ugyanazt az erőforrást, ezek a közös használatú erőforrások inkonzisztens állapotba kerülhetnek.

Ennek elkerülése érdekében, garantálni kell a kölcsönös kizárást az osztott erőforrás használatakor. Röviden, ha egy szál használja az adott erőforrást, másik szál nem érheti azt el.

Azon erőforrások, amelyek szálbiztosak, használhatók több szál által annak a veszélye nélkül, hogy inkonzisztencia merülne fel. (Statikus erőforrások általában szálbiztosak, objektumpéldányok általában nem.)

Szál típusok

Esemény-vezérelt szálak:
Eseményciklusok belső futtatása, aszinkron hívások használata.
Dolgozó szálak:
A szál törzsének a végrehajtása, majd kilépés. Nem használhatnak aszinkron hívásokat, mert nem futtathatnak esemény-ciklusokat.

Szálprogramozás

A párhuzamosítás kétféle képpen tehető meg:
  1. Definiálunk egy új osztályt, és a Thread-ből származtatjuk:
    Implementáljuk bármelyikét vagy mindegyikét a thread 3 virtuális műveletének: OnStart(), Run(), OnStop(). Esemény-vezérelt szálak esetében használható az alapértelmezett implementációja a Run() metódusnak.
  2. Definiálunk egy IRunnable interfészt megvalósító objektumot és azt átadjuk egy szál példánynak:
    A szálak futtatni tudják a Run() metódustát egy IRunnable implementációnak. Így bármilyen IRunnable objektumot futásra bírhatunk, ha átadjuk egy threadnek.

Míg a dolgozó folyamatok futása lineáris, addig az esemény-vezérelt szálaké - ahogy a nevük is mutatja -, egy esemény alapján indul, és addig ismétlődik, amíg egy stop értesítést nem kapnak.

Szál típusok