Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correction du pseudocode sem_wait et sem_post #21

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions Theorie/Threads/coordination.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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 :
Expand All @@ -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]_.
Expand Down