SyllabusC_Systeme icon indicating copy to clipboard operation
SyllabusC_Systeme copied to clipboard

Correction du pseudocode `sem_wait` et `sem_post`

Open precondition opened this issue 3 years ago • 0 comments

La diapositive 6 du chapitre 7 sur les sémaphores dit très clairement que le type de la valeur du sémaphore est un entier non-signé. slide 6 chapitre 7

Le syllabus évite de dire que c'est un entier non-signé mais la formulation « un entier qui stocke la valeur, positive ou nulle, du sémaphore » pourrait sous-entendre qu'un entier non-signé est utilisé.

En outre, nous pouvons aussi lire dans man sem_overview que la valeur d'un sémaphore ne peut pas descendre en dessous de zéro:

A semaphore is an integer whose value is never allowed to fall below zero. Two operations can be performed on semaphores: increment the value by one (sem_post(3)); and decrement the semaphore value by one (sem_wait(3)). If the value of a semaphore is currently zero, then a sem_wait(3) operation will block until the value becomes greater than zero.

Si on suppose que la valeur est un entier non-signé, la condition if(s->val<0) du pseudo-code fourni pour sem_wait est une contradiction; une condition jamais satisfaite.

Idem pour if(s->val<=0) dans sem_post. Il est impossible d'incrémenter un entier non-signé et d'obtenir un nombre inférieur à 0.

Ce PR met à jour le pseudo-code de sem_wait en décrémentant la valeur uniquement si celle-ci est strictement supérieure à 0 et en bloquant le thread si la valeur est égale à 0 (une condition réalisable, contrairement à s->val<0) et enlève le if dans sem_post.

precondition avatar Jan 04 '22 15:01 precondition