have returned. When is allowed to proceed past the statement in line 11, it can only be because and have completed and placed their results in and , making it safe to perform calculations on those results. The code example above uses the syntax of Cilk-5. The original Cilk (Cilk-1) used a rather different syntax that required programming in an explicit continuation-passing style, and the Fibonacci examples looks as follows: thread fib(cont int k, int n) { if (n < 2) { send_argument(k, n); } else { cont int x, y; spawn_next sum(k, ?x, ?y); spawn fib(x, n - 1); spawn fib(y, n - 2); } } thread sum(cont int k, int x, int y) { send_argument(k, x + y); } Inside 's recursive case, the keyword indicates the creation of a successor thread (as opposed to the child threads created by ), which executes the subroutine after waiting for the continuation variables and to be filled in by the recursive calls. The base case and use a operation to set their continuation variable to the value of , effectively "returning" the value to the successor thread. Inlets The two remaining Cilk keywords are slightly more advanced, and concern the use of inlets. Ordinarily, when a Cilk procedure is spawned, it can return its results to the parent procedure only by putting those results in a variable in the parent's frame, as we assigned the results of our spawned procedure calls in the example to x and y. The alternative is to use an inlet. An inlet is a function internal to a Cilk procedure which handles the results of a spawned procedure call as they return. One major reason to use inlets is that all the inlets of a procedure are guaranteed to operate atomically with regards to each other and to the parent procedure, thus avoiding the bugs that could occur if the multiple returning procedures tried to update the same variables in the parent frame at the same time. The inlet keyword identifies a function defined within the procedure as an inlet. The abort keyword can only be used inside an inlet; it tells the scheduler that any other procedures that have been spawned off by the parent procedure can safely be aborted. Inlets were removed when Cilk became Cilk++, and are not present in Cilk Plus. Parallel loops Cilk++ added an additional construct, the parallel loop,