1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
(* Test for condition variables. *)
open Thread;
open Thread Mutex ConditionVar;
val avar = conditionVar()
and amutex = mutex();
val bvar = conditionVar();
val cvar = conditionVar();
val dvar = conditionVar();
val stop = ref false
val avalue = ref 0
fun incValue threadNo () =
let
val () = lock amutex
fun loop() =
(
wait(avar, amutex);
if ! stop
then ()
else
(
avalue := !avalue + 1;
signal bvar;
loop()
)
)
in
signal dvar;
loop();
signal cvar;
unlock amutex
end;
fun addCount 0 = ()
| addCount n =
(
signal avar;
wait(bvar, amutex);
addCount (n-1)
);
lock amutex;
fork(incValue 1, [EnableBroadcastInterrupt true, InterruptState InterruptSynch]);
fork(incValue 2, [EnableBroadcastInterrupt true, InterruptState InterruptSynch]);
fork(incValue 3, [EnableBroadcastInterrupt true, InterruptState InterruptSynch]);
wait(dvar, amutex);
addCount 10000;
OS.Process.sleep(Time.fromSeconds 2);
stop := true;
signal avar;
wait(cvar, amutex);
signal avar;
wait(cvar, amutex);
signal avar;
wait(cvar, amutex);
if !avalue = 10000 then () else raise Fail "Incorrect";
|