A Cilk programozási nyelv

Alprogramok, modulok

Létrehozhatunk ugyanolyan függvényeket is, mint C-ben, de ezeket nem hívhatjuk meg spawn-nal (külön thread indításával), illetve ezen belül nem is használhatunk Cilk speciális utasításokat.

Cilk:
Ezen kívül léteznek úgynevezett cilk függvények, amelyeket már lehet "párhuzamosan" hívni, illetve ők is hívhatnak másokat "párhuzamosan". Ezek definíciója hasonló, mint C-ben, de az egész elé még egy cilk kulcsszót kell írni. Természetesen a main eljárást is így kell definiálni. Megkötés még, hogy a main függvény Cilk programban int visszatérési értékű legyen.
Pl.:

cilk int fibonacci(int n)

Ilyen függvényeket külön thread-ként kell indítanunk, normál hívásuk nem megengedett. Pl.:
x = spawn fibonacci(5);

Az ilyen eljárások paramétere bármilyen érvényes C kifejezés lehet, de a nyelv szintaxisa nem engedi, hogy mindenféle kifejezésben használjuk őket; csak utasításokban fordulhatnak elő, vagy szimpla értékadó szerkezetben.
Például a következő szintaxis helytelen:
a = spawn foo() + spawn bar();

A C-vel ellentétben nincs automatikus típuskonverzió értékadásnál (megvalósítása tervben van), ezért a következő kódrészlet hibás:
cilk float foo(void); cilk void bar(void) { int x; x = spawn foo(); sync; }

Inlet:
Az eljárások kifejezésekben való haszálatának megkötései miatt, bevezettek még egy eljárás típust az inlet-et, amely egy burkoló a Cilk eljárások számára. Ha egy inlet paramétereként indítunk egy eljárást, akkor az eljárás befejezése után meghívodik az inlet törzse, ahol a visszatérési értéket használhatjuk a C nyelv keretein belül. A "x += spawn ..." stílusú szerkezetek esetén a fordító maga készít egy inlet-et, így ezekhez külön nem szükséges írni. Az ilyen típusú implicit inlet-et viszont nem lehet együtt használni az explicittel egy spawn keretén belül.

cilk int fib (int n) { int x = 0; inlet void summer (int result) { x += result; return; } if (n<2) return n; else { summer(spawn fib (n-1)); summer(spawn fib (n-2)); sync; return (x); } }