“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 195 — #205
i
i
i
i
i
i
i
i
4.2 La programmation de base avec les fils
195
4.2.3 Le calcul dataflow avec des fils
Regardons ce que nous pouvons faire en ajoutant des fils aux programmes simples. Il
est important de se souvenir que chaque fil est un fil dataflow, qui suspend jusqu’à ce
que les données soient disponibles.
Le comportement dataflow simple
Nous commençons par l’observation du comportement dataflow dans un calcul simple.
Exécutez le programme suivant :
declare X0 X1 X2 X3 in
thread
Y0 Y1 Y2 Y3 in
{Browse [Y0 Y1 Y2 Y3]}
Y0=X0+1 Y1=X1+Y0 Y2=X2+Y1 Y3=X3+Y2
{Browse completed}
end
{Browse [X0 X1 X2 X3]}
Le Browser affiche toutes les variables comme non liées. Observez ce qui se passe
quand vous entrez les instructions suivantes une par une :
X0=0 X1=1 X2=2 X3=3
Après chaque instruction, le fil se réveille, exécute une addition et suspend de nouveau.
Quand X0 est liée, le fil peut exécuter Y0=X0+1. Il suspend de nouveau parce qu’il a
besoin de la valeur de X1 pour l’exécution de Y1=X1+Y0, et ainsi de suite.
Un programme déclaratif dans un contexte concurrent
Prenons un programme du chapitre 3 pour regarder comment il se comporte dans un
contexte d’exécution concurrente. La boucle ForAll est définie ainsi :
proc {ForAll L P}
case L of nil then skip
[] X|L2 then {P X} {ForAll L2 P} end
end
(Nous remarquons que Oz a une abstraction linguistique, la boucle for, qui utilise
ForAll et qui a la syntaxe suivante :
for X in L do {P X} end
La boucle for a d’autres fonctionnalités qui sont expliquées dans la documentation
de Mozart [21].) Que se passe-t-il quand nous exécutons ForAll dans un fil ? :
© Dunod – La photocopie non autorisée est un délit
i
i
i
i
i
i
i
i
4.2 La programmation de base avec les fils
195
4.2.3 Le calcul dataflow avec des fils
Regardons ce que nous pouvons faire en ajoutant des fils aux programmes simples. Il
est important de se souvenir que chaque fil est un fil dataflow, qui suspend jusqu’à ce
que les données soient disponibles.
Le comportement dataflow simple
Nous commençons par l’observation du comportement dataflow dans un calcul simple.
Exécutez le programme suivant :
declare X0 X1 X2 X3 in
thread
Y0 Y1 Y2 Y3 in
{Browse [Y0 Y1 Y2 Y3]}
Y0=X0+1 Y1=X1+Y0 Y2=X2+Y1 Y3=X3+Y2
{Browse completed}
end
{Browse [X0 X1 X2 X3]}
Le Browser affiche toutes les variables comme non liées. Observez ce qui se passe
quand vous entrez les instructions suivantes une par une :
X0=0 X1=1 X2=2 X3=3
Après chaque instruction, le fil se réveille, exécute une addition et suspend de nouveau.
Quand X0 est liée, le fil peut exécuter Y0=X0+1. Il suspend de nouveau parce qu’il a
besoin de la valeur de X1 pour l’exécution de Y1=X1+Y0, et ainsi de suite.
Un programme déclaratif dans un contexte concurrent
Prenons un programme du chapitre 3 pour regarder comment il se comporte dans un
contexte d’exécution concurrente. La boucle ForAll est définie ainsi :
proc {ForAll L P}
case L of nil then skip
[] X|L2 then {P X} {ForAll L2 P} end
end
(Nous remarquons que Oz a une abstraction linguistique, la boucle for, qui utilise
ForAll et qui a la syntaxe suivante :
for X in L do {P X} end
La boucle for a d’autres fonctionnalités qui sont expliquées dans la documentation
de Mozart [21].) Que se passe-t-il quand nous exécutons ForAll dans un fil ? :
© Dunod – La photocopie non autorisée est un délit
