Previous Up

3  Rémanence de pthread_join

La spécification POSIX de la fonction pthread_join() d’attente de terminaison d’un thread précise que la valeur ne peut être récupérée qu’une unique fois par un unique thread. Nous proposons ici de rendre cette valeur rémanente : elle pourra être accédée de multiples fois, par autant de threads que désiré.

Le principe est de mémoriser la valeur de type void * retournée par le thread au sein d’une structure et de faire des accès à cette structure pour accéder à cette valeur. De plus, un accès à cette structure alors que le thread n’a pas encore terminé devra être bloquant en attendant la terminaison.

Un type sera défini pour une telle structure :

struct join_s ; 

Une telle structure sera mémorisée pour chacun des threads dont on désire garder la valeur de retour rémanente. Deux fonctions d’allocation et de recherche de telles structures sont fournies (vous n’avez pas à les écrire). La fonction

struct join_s *new_join(pthread_t tid);

retourne un pointeur sur une nouvelle structure ; elle sera associée à la terminaison du thread tid.

La fonction

struct join_s *get_join_by_tid(pthread_t tid);

retourne pour sa part une référence sur la structure struct join_s associée au thread tid.

Notre objectif est de fournir trois fonctions équivalentes aux fonctions POSIX pthread_create(), pthread_exit(), et pthread_join(). L’utilisation de nos fonctions de remplacement permet des accès rémanents à la valeur retournée par un thread.

Une structure struct join_s se compose d’un indicateur de terminaison du thread, de la valeur de type void * retournée par le thread, d’un mécanisme permettant aux threads en attente de la terminaison du thread de se bloquer. Ces différentes valeurs peuvent être potentiellement accédées simultanément par plusieurs threads. On ajoutera donc un mécanisme assurant l’exclusion mutuel des accès.


Exercice 10
 (Structure struct join_s)   Donnez une définition de la structure struct join_s.

Exercice 11
 (Bibliothèque join)   Donnez une implémentation des trois fonctions jn_create(), jn_exit() et jn_join().

Previous Up