Communicating sequential processes - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Exemple de programmes de type producteur/consommateur

Un producteur, deux consommateurs

       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 :

  • de se mettre en attente si aucun des deux consommateurs n'est prêt ;
  • d'envoyer le nombre à l'un s'il est le seul prêt ;
  • de choisir aléatoirement entre les 2 consommateurs si les deux sont prêts.

Plusieurs producteurs, plusieurs consommateurs

       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      		]      
Page générée en 0.054 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise