Académique Documents
Professionnel Documents
Culture Documents
Sommaire Sommaire
Synchronisation en C/Posix Les smaphores Posix Les variables condition Posix Exemples dutilisation
Un Mutex est un smaphore binaire pouvant prendre un des deux tats "lock" (verrouill) ou "unlock" (dverrouill): valeur de smaphore 1 ou 0
Un Mutex ne peut tre partag que par des threads dun mme processus
Un Mutex ne peut tre verrouill que par une seule thread la fois.
Une thread qui tente de verrouiller un Mutex dj verrouill est suspendu jusqu' ce que le Mutex soit dverrouill.
avec une initialisation par dfaut lorsque mutexattr vaut NULL ex : pthread_mutex_init(&monMutex, NULL);
5 samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) -
Si le mutex est dj verrouill par une autre thread la tentative de verrouillage suspend l'appelant jusqu' ce que le mutex soit dverrouill.
Si le mutex est dj dverrouill, cet appel n'a aucun effet (comportement par dfaut)
Si le mutex est verrouill, une des threads en attente obtient le mutex (qui reprend alors l'tat verrouill) et cette thread redevient active (elle n'est plus bloque)
void Deposer(int m){ pthread_mutex_lock(&mutex); // dposer m dans tampon; On verrouille le Mutex : accs exclusif pthread_mutex_unlock(&mutex); } On dverrouille le Mutex
Le compteur associ un smaphore peut donc prendre des valeurs plus grande que 1 (contrairement un mutex)
La prise d'un smaphore dont le compteur est ngatif ou nul bloque l'appelant.
Il ne faut pas confondre les smaphores Posix avec les smaphores Unix qui sont en fait des tableaux de smaphores (non tudis ici).
Cration //Initialisation d'un smaphore Posix Cration Initialisation d'un smaphore Posix
Les prototypes des fonctions et les types sont dfinis dans semaphore.h Un smaphore est une variable de type sem_t Il est initialis par un appel la primitive : int sem_init(sem_t *sem, int pshared, unsigned int valeur); si "phsahed" vaut 0 le smaphore ne peut pas tre partag entre threads de diffrents processus (partage uniquement au sein d'un mme processus) valeur dfinit la valeur initiale de ce smaphore (positive ou nulle)
11
Prise //Relchement d'un smaphore Posix Prise Relchement d'un smaphore Posix
Les deux oprations P et V sont implmentes par P : V : int sem_wait(sem_t *sem); int sem_post(sem_t *sem);
Il existe galement une version non bloquante de la primitive P : int sem_trywait(sem_t *sem); qui retourne 0 lorsque la prise est possible (et non bloquante) et qui retourne EAGAIN sinon (dans le cas o l'appel normal serait bloquant)
12
Lecture de la valeur d'un smaphore Posix Lecture de la valeur d'un smaphore Posix
La primitive int sem_getvalue(sem_t *sem, int *sval); qui retourne dans sval la valeur courante du smaphore sem
La primitive int sem_destroy(sem_t *sem); qui permet de librer les ressources associes au smaphore sem
13
Avantages smaphores Posix Les smaphores Posix implmentent nimporte quel type de synchronisation entre les threads dun mme processus (en plus de lexclusion mutuelle).
14
Exemple du Prod/Cons avec les Smaphores Posix Exemple du Prod/Cons avec les Smaphores Posix
/* prodconsThread.c avec des threads*/ #include <stdio.h> #include <unistd.h> #include <semaphore.h> #include <fcntl.h>
#define Ncases 10
15
16
17
/* creation et initialisation des semaphores */ sem_init(&Snvide, 0, Ncases); sem_init(&Snplein, 0, 0); /* creation des threads */ pthread_create (&th1, 0, Producteur, NULL); pthread_create (&th2, 0, Consommateur, NULL); /* attente de terminaison */ pthread_join (th1, NULL); pthread_join (th2, NULL); /* suppression des semaphores */ sem_destroy(&Snplein); sem_destroy(&Snvide); return (0); }
18 samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) -
$gcc prodconsThread.c o prodcons lpthread $./prodcons Product 2100 Product 3250 Consomm 2100 Product 2540 Consomm 3250 Consomm 2540
19
- Les procdures du moniteur se synchronisent laide de deux primitives : Wait() Signal() qui permettent de bloquer ou de rveiller un processus sur une condition. Une condition est une variable qui na pas de valeur mais qui est implmente laide dune file dattente. Syntaxe des primitives : Cond.Wait() : bloque toujours le processus appelant Cond.Signal() : rveille un processus bloqu dans la file dattente associe Cond.
20 samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) -
21
Soit la condition de progression C, Le schma dutilisation des moniteurs Posix est le suivant :
pthread_mutex_lock (&leMutex); valuer C; while ( ! C ) { pthread_cond_wait(&laVariableCondition,&leMutex); r-valuer C si ncessaire } Faire le travail; pthread_mutex_unlock(&leMutex);
22
Exemple du Prod/Cons avec les moniteurs Posix Exemple du Prod/Cons avec les moniteurs Posix
#include <pthread.h> /* dfinition du tampon */ #define N 10 /* Nb de cases du tampon */ #define NbMess 20 /* Nb de messages changs */ int NbPleins=0; int tete=0, queue=0; int tampon[N]; /* dfinition des conditions et du mutex */ pthread_cond_t vide; pthread_cond_t plein; pthread_mutex_t mutex; pthread_t tid[2];
23
26
Conclusion Conclusion
Posix propose plusieurs mcanismes Mutex : pour les sections critiques Smaphores : pour la synchronisation entre threads en gnral Variables condition : pour lutilisation de moniteur
27
Rfrences Rfrences
Jean-Franois Peyre, supports de cours sur linformatique industrielle-systmes temps rel, CNAM(Paris). Samia Bouzefrane, LES SYSTEMES D'EXPLOITATION: COURS ET EXERCICES CORRIGES UNIX, LINUX et WINDOWS XP avec C et JAVA (566 pages), Dunod Editeur, Octobre 2003, ISBN : 2 10 007 189 0.
28