Question: comment réaliser un sémaphore si nous ne disposons que de verrous? typedef struct pthread_mutex_t mutex, attente; i n t valeur; Semaphore; Semaphore *CreerSemaphore(unsigned val) Semaphore *s = (Semaphore *)malloc( sizeof(semaphore)); i f (s!= NULL) pthread_mutex_init(&s->mutex,null); pthread_mutex_init(&s->attente,null); s->valeur = val; return s; void DetruireSemaphore(Semaphore *s) pthread_mutex_destroy(&s->mutex); pthread_mutex_destroy(&s->attente); free(s); void P(Semaphore *s) i f (s->valeur < 0) void V(Semaphore *s) i f (s->valeur <= 0) April 24, 2013 1 / 5
void P(Semaphore *s) i f (s->valeur < 0) void V(Semaphore *s) i f (s->valeur <= 0) April 24, 2013 2 / 5
i f (s->valeur < 0) ; i f (s->valeur <= 0) valeur 2 mutex ouvert Accès
T 1 i f (s->valeur < 0) ; i f (s->valeur <= 0) valeur 2 mutex ouvert Accès
T 1 i f (s->valeur < 0) ; i f (s->valeur <= 0) valeur 2 mutex fermé Accès
i f (s->valeur < 0) T 1 ; i f (s->valeur <= 0) valeur 1 mutex fermé Accès
i f (s->valeur < 0) ; T 1 i f (s->valeur <= 0) valeur 1 mutex fermé Accès
i f (s->valeur < 0) ; i f (s->valeur <= 0) valeur 1 mutex ouvert Accès T1
T 2 i f (s->valeur < 0) ; i f (s->valeur <= 0) valeur 1 mutex ouvert Accès T1
T 2 i f (s->valeur < 0) ; i f (s->valeur <= 0) valeur 1 mutex fermé Accès T1
i f (s->valeur < 0) T 2 ; i f (s->valeur <= 0) valeur 0 mutex fermé Accès T1
i f (s->valeur < 0) ; T 2 i f (s->valeur <= 0) valeur 0 mutex fermé Accès T1
i f (s->valeur < 0) ; i f (s->valeur <= 0) valeur 0 mutex ouvert Accès T1,T2
T 3 i f (s->valeur < 0) ; i f (s->valeur <= 0) valeur 0 mutex ouvert Accès T1,T2
T 3 i f (s->valeur < 0) ; i f (s->valeur <= 0) valeur 0 mutex fermé Accès T1,T2
i f (s->valeur < 0) T 3 ; i f (s->valeur <= 0) valeur -1 mutex fermé Accès T1,T2
i f (s->valeur < 0) T 3 ; i f (s->valeur <= 0) valeur -1 mutex fermé Accès T1,T2
i f (s->valeur < 0) ; T 3 i f (s->valeur <= 0) valeur -1 mutex ouvert Accès T1,T2
T 4 i f (s->valeur < 0) ; T 3 i f (s->valeur <= 0) valeur -1 mutex ouvert Accès T1,T2
T 4 i f (s->valeur < 0) ; T 3 i f (s->valeur <= 0) valeur -1 mutex fermé Accès T1,T2
i f (s->valeur < 0) T 4 ; T 3 i f (s->valeur <= 0) valeur -2 mutex fermé Accès T1,T2
i f (s->valeur < 0) T 4 ; T 3 i f (s->valeur <= 0) valeur -2 mutex fermé Accès T1,T2
i f (s->valeur < 0) ; T 3 T 4 i f (s->valeur <= 0) valeur -2 mutex ouvert Accès T1,T2
T 5 i f (s->valeur < 0) ; T 3 T 4 i f (s->valeur <= 0) valeur -2 mutex ouvert Accès T1,T2
T 5 i f (s->valeur < 0) ; T 3 T 4 i f (s->valeur <= 0) valeur -2 mutex fermé Accès T1,T2
i f (s->valeur < 0) T 5 ; T 3 T 4 i f (s->valeur <= 0) valeur -3 mutex fermé Accès T1,T2
i f (s->valeur < 0) T 5 ; T 3 T 4 i f (s->valeur <= 0) valeur -3 mutex fermé Accès T1,T2
i f (s->valeur < 0) ; T 3 T 4 T 5 i f (s->valeur <= 0) valeur -3 mutex ouvert Accès T1,T2
i f (s->valeur < 0) ; T 3 T 4 T 5 T 1 i f (s->valeur <= 0) valeur -3 mutex ouvert Accès T2
i f (s->valeur < 0) ; T 3 T 4 T 5 T 1 i f (s->valeur <= 0) valeur -3 mutex fermé Accès T2
i f (s->valeur < 0) ; T 3 T 4 T 5 i f (s->valeur <= 0) T 1 valeur -2 mutex fermé Accès T2
i f (s->valeur < 0) ; T 3 T 4 T 5 i f (s->valeur <= 0) T 1 valeur -2 mutex fermé Accès T2
i f (s->valeur < 0) ; T 3 T 4 T 5 i f (s->valeur <= 0) T 1 valeur -2 mutex ouvert Accès T2
i f (s->valeur < 0) ; T 3 T 4 T 5 T 2 i f (s->valeur <= 0) valeur -2 mutex ouvert attente ouvert Accès
i f (s->valeur < 0) ; T 3 T 4 T 5 T 2 i f (s->valeur <= 0) valeur -2 mutex fermé attente ouvert Accès
i f (s->valeur < 0) ; T 3 T 4 T 5 i f (s->valeur <= 0) T 2 valeur -1 mutex fermé attente ouvert Accès
i f (s->valeur < 0) ; T 3 T 4 T 5 i f (s->valeur <= 0) T 2 valeur -1 mutex fermé attente ouvert Accès
i f (s->valeur < 0) ; T 3 T 4 T 5 i f (s->valeur <= 0) T 2 valeur -1 mutex ouvert attente ouvert Accès
i f (s->valeur < 0) ; T 3 T 4 T 5 i f (s->valeur <= 0) valeur -1 mutex ouvert attente ouvert Accès
i f (s->valeur < 0) ; T 4 T 5 i f (s->valeur <= 0) valeur -1 mutex ouvert Accès T3
i f (s->valeur < 0) ; T 5 i f (s->valeur <= 0) valeur -1 mutex ouvert T4 Accès T3
i f (s->valeur < 0) ; i f (s->valeur <= 0) valeur -1 mutex ouvert T4,T5 Accès T3
Exercices Exercices 1 Comment faut-il modifier l implémentation d un sémaphore donnée par l algorithme du transparent 1 si nous voulons que les valeurs du sémaphore soient sur des entiers non signés (unsigned int)? 2 Comment implémentez-vous un verrou si vous ne disposez que de sémaphores? La sémantique du verrou doit évidemment être préservée. 3 Commentez la différence entre les deux codes suivants: void *tache(void *) pthred_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); printf("section critique\n"); pthread_mutex_unlock(&mutex); void *tache(void *) s t a t i c pthred_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); printf("section critique\n"); pthread_mutex_unlock(&mutex); April 24, 2013 4 / 5
Exercices Exercice Nous désirons réaliser une application possédant 2 tâches. Le programme principal est en charge de lancer les deux tâches. Etant donné que les tâches, une fois lancées, doivent attendre un signal du programme principal pour s exécuter, comment résoudre le problème à l aide de verrous? Et à l aide de sémaphores? April 24, 2013 5 / 5