let n = 10000000 let global = Array.init n (fun i -> 0) let cond = Condition.create () let mutex = Mutex.create () let rec check_consistent accum i = if i >= 0 then check_consistent (accum + global.(i)) (i-1) else if accum <> 0 then begin Printf.eprintf "Array sum inconsistent: %d\n" accum; flush stderr; exit 1 end let rec update_array x i = if i < n then begin if i mod 2 = 0 then global.(i) <- x else global.(i) <- -x; update_array x (i+1) end let start = ref false let barrier () = (* start all threads at same time *) Mutex.lock mutex; while !start = false do Condition.wait cond mutex done; Mutex.unlock mutex let worker i = barrier (); while true; do (* the transaction *) update_array i 0; (* end of transaction *) Printf.printf "worker %d OK\n" i; flush stdout; done let verifier () = barrier (); while true; do check_consistent 0 (n-1); Printf.printf "Check OK\n"; flush stdout; done let () = let a = Array.init 16 (fun i -> Thread.create worker i) in let t = Thread.create verifier () in start := true; Condition.broadcast cond; Printf.eprintf "started\n"; flush stderr; Array.iter Thread.join a; Thread.join t