Author: Christian.Queinnec@lip6.fr

## Introduction

On appelle concurrence l'indépendance causale entre plusieurs actions, comme l'exécution de plusieurs instructions en << même temps >>. C'est la définition que nous donnions du terme << parallèle >> en introduction de cette quatrième partie. Les processus de la bibliothèque `Unix` présentés au chapitre précédent peuvent être qualifiés de concurrents dans la mesure où le système Unix donne l'apparence de la simultanéité de leur exécution sur une machine mono-processeur. Mais la notion de processus et de concurrence ne s'applique pas qu'à ceux obtenus par l'appel système `fork`.
Le langage Objective CAML possède une bibliothèque pour les processus légers (threads). La principale différence entre un processus léger et un processus engendré par un `fork` vient du partage ou du non partage de la mémoire entre les différents processus issus du même programme. Entre deux processus légers, seul le contexte d'exécution diffère; le code et la zone mémoire des données sont partagés. Les processus légers n'améliorent pas les temps d'exécution d'une application. Leur principal intérêt est de pouvoir exprimer dans un langage de programmation des algorithmes concurrents.
La nature du langage choisi, impératif ou fonctionnel, fait varier le modèle de concurrence. Pour un programme impératif, comme chaque processus léger peut modifier la mémoire commune, on est dans un modèle à mémoire partagée. La communication entre processus peut se faire par valeurs écrites et lues dans cette mémoire. Pour un programme purement fonctionnel, c'est-à-dire sans effet de bord, et bien que la mémoire soit commune, les calculs qu'exécute chaque processus n'agissent pas sur l'état mémoire partagé. Dans ce cas le modèle utilisé est celui à mémoire distincte et l'interaction entre processus doit s'effectuer par la communication de valeurs via des canaux.
Le langage Objective CAML implante dans sa bibliothèque sur les processus légers les deux modèles. Le module `Thread` permet de lancer de nouveaux processus correspondants à l'appel d'une fonction avec son argument. Les modules `Mutex` et `Condition` apportent les outils de synchronisation que sont les verrous de zone d'exclusion mutuelle et les attentes sur condition. Le module `Event` implante un mode de communication de valeurs du langage par événements. Ces valeurs peuvent elles-mêmes être fonctionnelles, permettant ainsi d'échanger entre processus légers des calculs à effectuer. Comme souvent en Objective CAML il est possible de mélanger les deux modèles.
Cette bibliothèque est portable sur les différents systèmes sur lesquels fonctionne Objective CAML. À la différence du module `Unix`, la bibliothèque `Thread` permet l'utilisation de processus sur des machines ne tournant pas sous Unix.