(* Test: basics of the Thread interface *) MODULE Main; IMPORT Fmt, Wr, Thread, Stdio; TYPE T = Thread.Closure BRANDED "T" OBJECT inc: INTEGER; END; VAR task1, task2: T; t1, t2 : Thread.T; i: INTEGER; m: Thread.Mutex; PROCEDURE task (self: T) : REFANY RAISES {} = BEGIN LOCK m DO i := i + self.inc; Wr.PutText (Stdio.stdout, "Changing i to " & Fmt.Int (i) & "\n"); END; RETURN NIL; END task; BEGIN m := Thread.NewMutex (); task1 := NEW (T, apply := task, inc := 3); task2 := NEW (T, apply := task, inc := 7); i := 12; Wr.PutText (Stdio.stdout, "i = " & Fmt.Int (i) & "\n"); t1 := Thread.Fork (task1); t2 := Thread.Fork (task2); EVAL Thread.Join (t1); EVAL Thread.Join (t2); Wr.PutText (Stdio.stdout, "i = " & Fmt.Int (i) & "\n"); Wr.PutText (Stdio.stdout, "\ndone.\n"); Wr.Close (Stdio.stdout); END Main.