blob: 9dae688f21007f68d75bc6eac6259459f5036695 (
plain)
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
|
(***********************************************************************)
(* *)
(* OCaml *)
(* *)
(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
(* *)
(* Copyright 1996 Institut National de Recherche en Informatique et *)
(* en Automatique. All rights reserved. This file is distributed *)
(* under the terms of the Q Public License version 1.0. *)
(* *)
(***********************************************************************)
open Event
let add_ch = new_channel()
let sub_ch = new_channel()
let read_ch = new_channel()
let rec accu n =
select [
wrap (receive add_ch) (fun x -> accu (n+x));
wrap (receive sub_ch) (fun x -> accu (n-x));
wrap (send read_ch n) (fun () -> accu n)
]
let rec sender chan value =
sync(send chan value); sender chan value
let read () =
print_int(sync(receive read_ch)); print_newline()
let main () =
Thread.create accu 0;
Thread.create (sender add_ch) 1;
Thread.create (sender sub_ch) 1;
while true do read() done
let _ = Printexc.catch main ()
|