===== output ===== phil@d64:~/oc4mc/tests/Threads/Join$ time ./compute3.exe ; echo ; echo "========" ; echo ; time ./compute3.exe_orig start of 1 start of 2 start of 3 start of 4 start of 5 start of 6 start of 8 start of 7 end of 1 end of 7 end of 8 end of 3 end of 4 end of 6 end of 5 end of 2 end of all! real 0m30.740s user 2m7.312s sys 0m0.392s ======== start of 1 start of 2start of 3start of 4start of 5 start of 6 start of 8 start of 7 end of 1 end of 3 end of 8end of 6 end of 4 end of 2 end of 7 end of 5 end of all! real 4m45.049s user 4m41.454s sys 0m4.456s ===== compute3.ml ===== let id = ref 0 let compute () = let x = incr id ; !id in print_endline ("start of " ^ string_of_int x); Thread.yield (); let t = Array.make 1_000_000 0. in flush stdout; Thread.yield (); List.iter Thread.join (List.map (fun e -> Thread.create e ()) (List.map (fun _ e -> for z = 0 to 100 do Thread.yield(); for i = 0 to Array.length t - 1 do t.(i) <- t.(i) *. t.(i) +. 42.; t.(i) <- t.(i) *. t.(i) +. 42.; t.(i) <- t.(i) *. t.(i) +. 42.; t.(i) <- t.(i) *. t.(i) +. 42.; t.(i) <- t.(i) *. t.(i) +. 42.; t.(i) <- t.(i) *. t.(i) +. 42. done; done) [1;2;3;4;5;6;7;8;9;10;])); print_endline ("end of " ^ string_of_int x); flush stdout; let t = Array.make 1_000_000 0 in Thread.yield () let _ = let l = List.map (Thread.create compute) [ () ; () ; () ; () ; () ; () ; () ; () ; ] in List.map Thread.join l let _ = print_endline "end of all!"