Vous êtes sur la page 1sur 3

Threads Posix

THREADS POSIX
L'objectif de ce tp est l'utilisation de l'api des threads posix. Pour compiler vos programme, vous devez les lier la librairie pthread. : gcc o executable lpthread votre_programme.c

1. CREATION DE THREADS
Utilisation des functions pthread_create, pthread_self, pthread_exit et pthread_join. 1.1. Ecrivez un programme o la thread main cre NB_THREADS nouvelles threads (thread_rand) ayant des attributs par dfaut (valeur NULL pour le paramtre attributs). Chaque nouvelle thread reoit comme argument son numro dordre de cration i (i = 0.. NB_THREADS -1). Une thread thread_rand doit afficher son numro dordre ainsi que son identit ( tid ). Elle se termine alors en retournant son numro dordre multipli par 2. De son ct, la thread main doit attendre la terminaison de toutes les threads thread_rand en affichant la valeur renvoye par les threads thread_rand lors de leur terminaison.

2. EXCLUSION MUTUELLE
Utilisation des functions pthread_mutex_lock , pthread_mutex_unlock. 2.1. Modifiez le programme 1.1 pour que chaque thread_rand gnre une valeur alatoire entre 0 et 10. Pour cela utilisez la fonction rand ( ) de la faon suivante:
random_val = (int) ((float)10*rand()/ (RAND_MAX +1.0));

La thread thread_rand doit afficher cette valeur et lajouter une variable global, initialise zro par la thread main . Aprs avoir attendre la terminaison de toutes les threads thread_rand , la thread main doit afficher la valeur de cette variable globale qui contiendra la somme de valeurs alatoires gnres.

3. SYNCHRONISATION
Utilisation des functions pthread_cond_wait , pthread_cond_signal. 3.1. Modifiez le programme 2.1 pour que laffichage de la valeur finale ne soit pas faite par la thread main mais si par une nouvelle thread print_thread (cre par main ). Aprs sa cration, cette thread reste bloque en attendant que la somme des toutes les valeurs alatoires soit complte. La dernire thread thread_rand ajouter sa valeur alatoire la variable globale rveille alors la thread affichage pour quelle puisse afficher la valeur finale.

- 1 -

Threads Posix

4. DETACHEMENT DES THREADS


Utilisation des function pthread_detach, pthread_attr_init, pthread_ 4.1. Modifiez le programme 3.1 pour que les threads thread_rand soit dtaches aprs leur cration en utilisant la fonction pthread_detach. attr_setdetachstate

4.2. Faites la mme modification en PTHREAD_CREATE_DETACHED). crant la tache en tat dtache (attribut

5. SYNCHRONISATION - BROADCAST
Utilisation des functions pthread_cond_wait , pthread_cond_broadcastl. Une barrire est un mcanisme de synchronisation. Elle permet N thread de prendre rendez-vous en un point donn de leur excution. Quand une des thread atteint la barrire, elle reste bloque jusqu ce que tous les autres arrivent la barrire. Lorsque les N threads sont arrivs la barrire, chacun des threads peut alors reprendre son excution. 5.1. Prodrammez la fonction wait barrier (int nb_threads) qui permet nb_threads de synchroniser une barrire. Testez votre programme avec la thread suivante :
void* thread_func (void *arg) { printf ("avant barrire); wait_barrier (NB_THREADS); printf ("aprs barrire); pthread_exit ( (void*)0); }

En excutant votre programme avec 2 threads, il devra afficher : avant barrire avant barrire aprs barrire aprs barrire Cela dit les message aprs barrire avant barrire doivent tre affichs avant laffichage des messages

- 2 -

Threads Posix

6. TRAITEMENT CONCURRENT DE FICHIERS


Utilisation des functions: pthread_create, pthread_join, pthread_mutex_lock, pthread_mutex_unlock. Le programme ci-dessous transforme en majuscule le contenu dun fichier dont le nom est pass en argument.
#define _POSIX_SOURCE 1 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main (int argc, char ** argv) { FILE* fp1, *fp2; int c; fp1= fopen (argv[1], "r"); fp2= fopen (argv[1], "r+"); if ((fp1== NULL) || (fp2== NULL)) { perror ("fopen"); exit (1); } while (c !=EOF) { c=fgetc(fp1); if (c!=EOF) fputc(toupper(c),fp2); } fclose (fp1); fclose (fp2); return EXIST_SUCCESS }

6.1. Modifiez le programme ci-dessus pour quil accepte en le nom de plusieurs fichiers en argument. Le programme doit crer une thread pour chaque fichier dont le nom est pass en argument et le traitement dun fichier sera fait au sein de sa thread (NB_THREAD = nombre de nom de fichiers). 6.2. On considre maintenant que le nombre de threads cres (NB_THREAD) est infrieur au nombre de fichier traiter. Chaque thread traite un fichier. Des quelle a termin de le traiter, elle doit vrifier sil y a encore de fichier traiter. Si cest le cas elle le traite. Elle rpte cette procdure tant quil existe de fichier traiter. Sinon elle se termine. Modifiez le programme 6.1 en consquence.

- 3 -

Vous aimerez peut-être aussi