PRODUCTEUR == nb: integer:= 0; *[ nb < 100 -> delegueur!nb; nb:= nb + 1 ] DELEGUEUR == nb: integer; *[ true -> producteur?nb; [ consommateur[1]!nb -> skip [] consommateur[2]!nb -> skip ] ] CONSOMMATEUR == nb: integer; *[ true -> delegueur?nb; print (nb) ] MAIN == [ producteur:: PRODUCTEUR || consommateur[i:1..2]:: CONSOMMATEUR || delegueur:: DELEGUEUR ]
Un producteur envoie une suite de nombre à un processus délégueur qui les transmet à deux consommateurs. L'utilisation d'une commande alternative dans le délégueur permet :
define NP 10 // Nombre de producteurs define NC 10 // Nombre de consommateurs define TL 5 // Taille du tampon intermédiaire CONSOLE == msg: string; *[ true-> [ (i:1..NP) producteur[i]?write (msg) -> print (msg) [] (i:1..NC) consommateur[i]?write (msg) -> print (msg) ] ] PRODUCTEUR == nb: integer:= 0; message: string; *[ true -> message:= "objet num " + nb; liste!prod(message); console!write ("production " + i + ": " + message + "\n"); nb:= nb + 1 ] LISTE == tab: [0..TL-1] string:= [0..TL-1] ""; used,mark: integer:= 0; message: string:= ""; *[ (i:1..NP) used < TL; producteur[i]?prod(tab[(mark + used) mod TL]) -> used:= used + 1 [] (i:1..NC) used > 0; consommateur[i]!cons(tab[mark]) -> mark:= (mark + 1) mod TL; used:= used - 1 ] CONSOMMATEUR == message: string; *[ true -> liste?cons(message); console!write ("consommateur " + i + ": " + message + "\n") ] MAIN == [ producteur[i:1..NP]:: PRODUCTEUR || consommateur[i:1..NC]:: CONSOMMATEUR || liste:: LISTE || console:: CONSOLE ]