diff --git a/Theorie/Threads/coordination.rst b/Theorie/Threads/coordination.rst index 0ecbb18..182be98 100644 --- a/Theorie/Threads/coordination.rst +++ b/Theorie/Threads/coordination.rst @@ -10,7 +10,7 @@ Les sémaphores Le problème de la coordination entre threads est un problème majeur. Outre les :term:`mutex` que nous avons présenté, d'autres solutions à ce problème ont été développées. Historiquement, une des premières propositions de coordination sont les sémaphores [Dijkstra1965b]_. Un :term:`sémaphore` est une structure de données qui est maintenue par le système d'exploitation et contient : - - un entier qui stocke la valeur, positive ou nulle, du sémaphore. + - un entier non-signé qui stocke la valeur, positive ou nulle, du sémaphore. - une queue qui contient les pointeurs vers les threads qui sont bloqués en attente sur ce sémaphore. Tout comme pour les :term:`mutex`, la queue associée à un sémaphore permet de bloquer les threads qui sont en attente d'une modification de la valeur du sémaphore. @@ -59,12 +59,15 @@ Les deux principales fonctions de manipulation des sémaphores sont `sem_wait(3) int sem_wait(semaphore *s) { - s->val=s->val-1; - if(s->val<0) - { - // Place this thread in s.queue; - // This thread is blocked; - } + if(s->val>0) + { + s->val=s->val-1; + } + if(s->val==0) + { + // Place this thread in s.queue; + // This thread is blocked; + } } La fonction `sem_post(3)`_ quant à elle peut schématiquement s'implémenter comme suit : @@ -75,11 +78,8 @@ La fonction `sem_post(3)`_ quant à elle peut schématiquement s'implémenter co int sem_post(semaphore *s) { s->val=s->val+1; - if(s.val<=0) - { - // Remove one thread T from s.queue; - // Mark thread T as ready to run; - } + // Remove one thread T from s.queue; + // Mark thread T as ready to run; } Ces deux opérations sont bien entendu des opérations qui ne peuvent pas s'exécuter simultanément. Leur implémentation réelle comprend des sections critiques qui doivent être construites avec soin. Le pseudo-code ci-dessus ignore ces sections critiques. Des détails complémentaires sur l'implémentation des sémaphores peuvent être obtenus dans des livres de référence sur les systèmes d'exploitation [Stallings2011]_ [Tanenbaum+2009]_.