(*
* $Id: prodcons.ocaml,v 1.6 2001/07/28 21:52:59 doug Exp $
* http://www.bagley.org/~doug/shootout/
*
* ocamlopt -thread unix.cmxa threads.cmxa prodcons.ml -o prodcons
* or
* ocamlc -thread unix.cma threads.cma prodcons.ml -o prodcons
*)
let count = ref 0
let data = ref 0
let produced = ref 0
let consumed = ref 0
let m = Mutex.create ()
let c = Condition.create ()
let producer n =
for i = 1 to n do
Mutex.lock m;
while !count = 1 do Condition.wait c m done;
data := i;
incr count;
Condition.signal c;
Mutex.unlock m;
incr produced
done
let consumer n =
let i = ref 0 in
while !i <> n do
Mutex.lock m;
while !count = 0 do Condition.wait c m done;
i := !data;
decr count;
Condition.signal c;
Mutex.unlock m;
incr consumed
done
let n = if Array.length Sys.argv > 1 then int_of_string Sys.argv.(1) else 1
let p = Thread.create producer n and c = Thread.create consumer n;;
Thread.join p; Thread.join c;
Printf.printf "%d %d\n" !produced !consumed