Les sémaphores POSIX permettent aux processus et aux threads
de synchroniser leurs actions.
Un sémaphore est un entier dont la valeur ne doit jamais descendre
en dessous de zéro.
Deux opérations peuvent être effectuées sur un sémaphore :
incrémenter la valeur du sémaphore par un
(sem_post(3)) ;
décrémenter la valeur du sémaphore par un
(sem_wait(3)).
Si la valeur d'un sémaphore est zéro, une opération
sem_wait(3)
bloquera jusqu'à ce que la valeur devienne supérieure à zéro.
Les sémaphores POSIX ont deux formes possibles :
les sémaphores nommés et les sémaphores non-nommés.
-
- Sémaphores nommés
-
Un sémaphore nommé est identifié par un nom de la forme
/unnom.
Deux processus peuvent opérer sur le même sémaphore nommé
en passant le même nom à
sem_open(3).
La fonction
sem_open(3)
crée un nouveau sémaphore nommé ou en ouvre un existant.
Après que le sémaphore ait été ouvert, on peut y travailler dessus avec
sem_post(3)
et
sem_wait(3).
Lorsqu'un processus a fini d'utiliser un sémaphore, on peut utiliser
sem_close(3)
pour fermer le sémaphore.
Lorsque tous les processus ont fini d'utiliser le sémaphore,
celui-ci peut être supprimé du système avec
sem_unlink(3).
-
- Sémaphores non-nommés (sémaphores basés sur la mémoire)
-
Un sémaphore non-nommé n'a pas de nom.
À la place, il est placé dans une région de la mémoire qui est partagée
entre plusieurs threads (un
sémaphore partagé entre threads)
ou processus (un
sémaphore partagé entre processus).
Un sémaphore partagé entre threads est placé dans une zone mémoire
partagée entre les threads d'un processus,
par exemple, une variable globale.
Un sémaphore partagé entre processus doit être placé dans une région
mémoire partagée (par exemple, un segment de mémoire partagée System V
créé avec
semget(2),
ou un objet mémoire partagée POSIX créé avec
shm_open(3)).
Avant d'être utilisé, un sémaphore non-nommé doit être initialisé avec
sem_init(3).
On peut ensuite travailler dessus avec
sem_post(3)
et
sem_wait(3).
Lorsque le sémaphore n'est plus nécessaire et avant que la mémoire dans
laquelle il est situé ne soit désallouée,
le sémaphore devrait être détruit avec
sem_destroy(3).
La suite de cette section décrit quelques détails spécifiques à
l'implémentation Linux des sémaphores POSIX.