Szintaxis
A nyelv operációs rendszer szintű szálakat támogat.
Ha használni szeretnénk ezen lehetőségeket, a fordításkor használnunk kell a --thread kapcsolót.
Alapvetően a Thread osztály statikus metódusait kell hívnunk.
- Thread.supported() a programunk elején ennek segítségével megbizonyosodhatunk abban, hogy párhuzamosság támogatással fordítottak -e.
- Thread.create(func1, is_joinable) új szálként futtatja a megadott metódust (pontosabban szlotot). unowned referenciát ad vissza az új szálra ha sikeres, különben ThreadError kivételt dob. Az is_joinable paraméter mutatja, hogy lehet -e a befejeződésére várni. Megjegyzés: kilépéskor a gyerekszálak is befejeződnek.
- Thread.usleep(1000): adott ideig várakozik
A Thread osztály fontosabb nem-statikus metódusai:
- join(): vár amíg be nem fejeződik az adott szál
- get_priority(), set_priority(ThreadPriority p): lekéri / beállítja a szál prioritását
A MainLoop osztály segítségével tudunk eseménykezelő főciklust használni magas szinten.
Ennek használata javasolt például grafikus felületű alkalmazások fejlesztéséhez is.
Ezt szemlélteti a linkelt segédletből származó következő kód:
void main() {
var loop = new MainLoop()
var time = new TimeoutSource(2000)
time.set_callback(def ()
print "Time!"
loop.quit()
return false)
time.attach(loop.get_context())
loop.run()
Kommunikáció
Az AsyncQueue<T> sablon osztály segítségével tudunk szálak között kommunikálni.
Ez az osztály aszinkron levelesláda szemantikával tesz lehetővé adatátvitelt soron keresztül.
A sablonparaméter a kommunikáció egységét hatátozza meg, azaz hogy milyen adatokat fogunk rajta keresztül küldeni.
Két legfontos metódusa:
- push(data): beteszi az adott adatot a sorba és ha van esetlegesen adatra várakozó folyamat akkor felébreszti
- pop(): ha van, akkor kiveszi és visszaadja a sorból a következő üzenetet, különben blokkol amíg nem jön új
Szinkronizáció
A Mutex osztály lehetőséget ad folyamatok közötti szinkronizációra.
Kérésre kizárólagos hozzáférést biztosít egy szálnak egy erőforráshoz, ezáltal garantálva, hogy két szál ne férjen hozzá szimultán ugyanahhoz az erőforráshoz.
Az osztálynak két fontos metódusa van:
- lock(): zárat igényel az erőforráshoz. Ha foglalt, blokkol amíg fel nem szabadul és utána kap hozzáférést.
- unlock(): felszabadtja a kapott zárat
A Cond osztály egy adott kondíciót reprezentál, amelynek teljesülésére várakozhatnak szálak, illetve egyik metódusával jelezhetjük a kondíció teljesülését.
- wait(): blokkolja a hívó szálat amíg nem ébresztik fel
- broadcast(): felébreszti az adott objektumra várakozókat