ChucK

Párhuzamosság, folyamatok, shredek

A ChucK lehetővé teszi több folyamat egyidejű futtatását (a folyamatok úgy viselkednek, mintha párhuzamosan futnának). A folyamat ChucKi megfelelője a shred. Egy shred "spork"-olása a virtuális gépen új folyamat indítását jelenti.

A ChucK az időkezelő mechanizmuson keresztül a minta-szinkronizált, nem-preemptív párhuzamosságot támogatja. Időzítések segítségével tetszőleges számú program/shred automatikusan ütemezhető és szinkronizálható. A "minta-szinkronizált" párhuzamosság annyit tesz, hogy a folyamatok közötti időzítés minták szintjén garantáltan precíz. Fontos megjegyezni, hogy a folyamatoknak/shredeknek nem kell tudniuk egymásról, az időt helyileg kezelik. A virtuális gép biztosítja a helyes működést magasabb szinten. Végül a párhuzamosság az időzítéshez hasonlóan determinisztikus a ChucKban.

A legegyszerűbb mód több shred egyidejű futtatására, ha a parancssoron megadjuk őket:

%> chuck foo.ck bar.ck boo.ck

A fenti parancs a foo.ck, bar.ck és boo.ck fájlokat futtatja egyidejűleg.

Shredek indítása

Shred elágaztatására a spork kulcsszó/operátor használható:

// go() függvény definiálása fun void go() { // törzs } // új shred indítása, ami go()-t hajtja végre spork ~ go(); // még egy shred indítása, referencia eltárolása offspring-ben spork ~ go() => Shred @ offspring;

Egy kicsit hosszabb példa:

// függvénydefiníció fun void foo( string s ) { // végtelen idő ciklus while( true ) { // s kiírása <<< s >>>; // idő léptetése 500::ms => now; } } // új shred indítása, "you" praméterrel spork ~ foo( "you" ); // idő léptetése 250 ms-el 250::ms => now; // másik shred indítása spork ~ foo( "me" ); // végtelen idő ciklus - gyerekek életben tartására while( true ) 1::second => now;

A me kulcsszó

A me kulcsszó (Shred típusú pszeudováltozó) referencia az aktuális shredre.

Néha hasznos az aktuális shredet felfüggesztése az idő léptetése nélkül más shredek futását lehetővé téve. Erre való a me.yield(). Gyakran hasznos sporkolás után rögtön megválni a vezérléstől, így más shredeknek lehetőséget adni a futásra az idő léptetése nélkül.

// shred indítása spork ~ go(); // aktuális shred felfüggesztése ... // ... más shredek (amik 'now'-ra vannak ütemezve) is esélyt kapnak a futásra me.yield();

Hasznos lehet kilépni az aktuális shredből.

// midi bemenet objektum készítése MidiIn min; // kísérlet 0-s eszköz megnyitására (chuck --probe listázza az összes eszközt) if( !min.open( 0 ) ) { // hibaüzenet megjelenítése <<< "can't open MIDI device" >>>; // kilépés az aktuális shredből me.exit(); }

Le lehet kérdezni a shedek azonosítóját:

// shred azonosító kiírása <<< me.id(); >>>;

Ezen föggvényekkel minden shred rendelkezik, de a yield()-et és exit()-et általában csak az aktuális shredre használják.

A machine.add() használata

A machine.add( string path ) elindítja a path-ban megadott ChucK programot. A spork ~-mal ellentétben nem lesz szülő-gyerek viszony az új és a hívó shred között. Hasznos előre megírt programok dinamikus indítására.

// "foo.ck" indítása machine.add( "foo.ck" );

Jelenleg a visszatérési értéke az új shred azonosítója, és nem referencia a shredre. Ez a viselkedés később valószínűleg változni fog.

Hasonlóan, shredeket el is lehet távolítani a virtuális gépből.

// indítás machine.add( "foo.ck" ) => int id; // id azonosítójú shred eltávolítása machine.remove( id ); // indítás machine.add( "boo.ck" ) => id // shred lecserélése "bar.ck"-ra machine.replace( id, "bar.ck" );

Shredek közti adatcsere

Azonos fájlból indított shredek osztoznak a globális változókon. Az időt és eseményeket használhatják a szinkronizációhoz. Különböző fájlokból indított shredek is osztozhatnak adatokon, jelenleg erre egy nyilvános osztály statikus adattagjai használhatóak. Ez a megoldás hamarosan javításra kerül!