“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 194 — #204
i
i
i
i
i
i
i
i
194
4
• La programmation concurrente dataflow
Une nouvelle variable dataflow, Y, est créée pour la communication entre le nouveau
fil et le fil principal. L’addition bloque jusqu’à ce que le calcul 10 * 10 soit terminé.
Quand un fil n’a plus d’instructions à exécuter, il termine. Chaque fil non terminé qui
n’est pas suspendu sera exécuté tôt ou tard. Nous disons que les fils sont ordonnancés
équitablement. L’exécution des fils est implémenté avec un ordonnancement préemptif.
Si plusieurs fils sont prêts à s’exécuter, chaque fil aura des tranches de temps en
intervalles. Il n’est pas possible pour un fil de monopoliser tout le temps du processeur.
4.2.2 Les fils et le Browser
Le Browser est un bon exemple d’un programme qui fonctionne bien dans un environnement concurrent. Par exemple :
thread {Browse 111} end
{Browse 222}
Dans quel ordre les valeurs 111 et 222 seront-elles affichées ? La réponse est : les
deux ordres sont possibles ! Est-il possible que l’on affiche quelque chose comme
112122, ou pire, que le Browser ait un comportement erroné ? À première vue, cela
semble possible, parce que le Browser doit exécuter beaucoup d’instructions pour afficher les valeurs 111 et 222. Sans précautions particulières, ces instructions peuvent
effectivement être exécutées dans beaucoup d’ordres différents. Mais le Browser a
été conçu pour une utilisation concurrente. Il n’affichera jamais des entrelacements
étranges. Chaque appel du Browser affichera dans sa propre partie de la fenêtre. Si
l’argument contient une variable non liée qui est liée plus tard, l’affichage sera mis
à jour quand la variable sera liée. Ainsi, le Browser affichera correctement plusieurs
flots qui s’étendront en concurrence, par exemple :
declare X1 X2 Y1 Y2 in
thread {Browse X1} end
thread {Browse Y1} end
thread X1=all|roads|X2 end
thread Y1=all|roams|Y2 end
thread X2=lead|to|rome|_ end
thread Y2=lead|to|rhodes|_ end
Les deux flots
all|roads|lead|to|rome|_
all|roams|lead|to|rhodes|_
sont affichés correctement dans deux parties différentes de la fenêtre du Browser. Nous
verrons comment écrire des programmes concurrents qui se comportent correctement,
comme le Browser.
i
i
i
i
i
i
i
i
194
4
• La programmation concurrente dataflow
Une nouvelle variable dataflow, Y, est créée pour la communication entre le nouveau
fil et le fil principal. L’addition bloque jusqu’à ce que le calcul 10 * 10 soit terminé.
Quand un fil n’a plus d’instructions à exécuter, il termine. Chaque fil non terminé qui
n’est pas suspendu sera exécuté tôt ou tard. Nous disons que les fils sont ordonnancés
équitablement. L’exécution des fils est implémenté avec un ordonnancement préemptif.
Si plusieurs fils sont prêts à s’exécuter, chaque fil aura des tranches de temps en
intervalles. Il n’est pas possible pour un fil de monopoliser tout le temps du processeur.
4.2.2 Les fils et le Browser
Le Browser est un bon exemple d’un programme qui fonctionne bien dans un environnement concurrent. Par exemple :
thread {Browse 111} end
{Browse 222}
Dans quel ordre les valeurs 111 et 222 seront-elles affichées ? La réponse est : les
deux ordres sont possibles ! Est-il possible que l’on affiche quelque chose comme
112122, ou pire, que le Browser ait un comportement erroné ? À première vue, cela
semble possible, parce que le Browser doit exécuter beaucoup d’instructions pour afficher les valeurs 111 et 222. Sans précautions particulières, ces instructions peuvent
effectivement être exécutées dans beaucoup d’ordres différents. Mais le Browser a
été conçu pour une utilisation concurrente. Il n’affichera jamais des entrelacements
étranges. Chaque appel du Browser affichera dans sa propre partie de la fenêtre. Si
l’argument contient une variable non liée qui est liée plus tard, l’affichage sera mis
à jour quand la variable sera liée. Ainsi, le Browser affichera correctement plusieurs
flots qui s’étendront en concurrence, par exemple :
declare X1 X2 Y1 Y2 in
thread {Browse X1} end
thread {Browse Y1} end
thread X1=all|roads|X2 end
thread Y1=all|roams|Y2 end
thread X2=lead|to|rome|_ end
thread Y2=lead|to|rhodes|_ end
Les deux flots
all|roads|lead|to|rome|_
all|roams|lead|to|rhodes|_
sont affichés correctement dans deux parties différentes de la fenêtre du Browser. Nous
verrons comment écrire des programmes concurrents qui se comportent correctement,
comme le Browser.
