Académique Documents
Professionnel Documents
Culture Documents
#include <pthread.h>
- La déclaration d’un ou plusieurs descripteurs de threads comme suit :
pthread_t T1, T2; /* descripteurs de thread */
Remarque : 3. lors de la fin d’exécution de la routine qui a créé un thread cela implique aussi
la fin de l’exécution de ce dernier.
4. Lorsque la fonction principale d’un thread se termine, celui-ci est éliminé. Cette
fonction doit renvoyer une valeur de type void * qui pourra être récupérée dans un autre fil
d’exécution. Il est aussi possible d’invoquer la fonction pthread_exit(), qui met fin au thread
appelant tout en renvoyant le pointeur void * passé en argument. On ne doit naturellement pas
invoquer exit(), qui mettrait fin à toute l’application et pas uniquement au thread appelant.
• Si l’argument retour n’est pas NULL, il pointe vers la valeur de retour du thread (ou,
pointe vers PTHREAD_CANCELED en cas de résiliation).
• pthread_join revoie 0 en cas de succès (errno n’est pas positionné en cas d’échec).
- Détacher un thread :
int pthread_detach (pthread_t thread);
Lorsqu’un thread ne renvoie pas de valeur intéressante et qu’il n’a pas besoin d’être attendu par
un autre thread, on peut employer la fonction pthread_detach(), qui lui permet de disparaître
automatiquement du système quand il se termine. Cela autorise la libération immédiate des
ressources internes à la bibliothèque concernant ce thread (pile et variables automatiques). Le
mécanisme n’est pas sans rappeler le passage des processus à l’état Zombie en attendant qu’on
lise leur code de retour et l’emploi de SIG_IGN pour le signal SIGCHLD du processus parent.
- Annuler un thread :
int pthread _ cancel ( pthread_t thread) ;// Permet de d'"annuler" (de terminer) un
thread.
• Un thread peut vouloir annuler un autre thread. Il envoie alors une demande
d’annulation, qui sera prise en compte ou non, en fonction de la configuration du thread
récepteur.
• Lorsqu’un thread est annulé, il se comporte exactement comme s’il invoquait la fonction
pthread_exit() avec l’argument spécial PTHREAD_CANCELED.
• Le thread récepteur peut accepter la requête, la refuser ou la repousser jusqu’à atteindre
un point d’annulation dans son exécution
• la fonction pthread_cancel(), qui renvoie 0 si elle réussit, ou l’erreur ESRCH si le thread
visé n’existe pas.
Université d’Ain Temouchent Belahdj Bouchaib
Faculté des sciences et technologies – département mathématique et informatique
Exercice 1.
Soit le programme C qui permet de créer 5 threads
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define NB_THREADS 5
void *fn_thread (void *numero);
static int compteur = 0;
int
main (void)
{
pthread_t thread[NB_THREADS];
int i;
int ret;
for (i = 0; i < NB_THREADS; i ++)
if (pthread_create(&thread[i], NULL, fn_thread, &i) != 0) {
fprintf(stderr, "%s", strerror(ret));
exit(EXIT_FAILURE);
}
while (compteur < 40) {
fprintf(stdout, "main : compteur = %d \n", compteur);
//sleep(1);
}
for (i = 0; i < NB_THREADS; i ++)
pthread_join(thread[i], NULL);
return EXIT_SUCCESS;
}
void *fn_thread (void *num)
{
int numero = *((int *) num);
while (compteur < 40) {
//usleep(numero * 100000);
compteur ++;
fprintf(stdout, "Thread %d : compteur = %d \n",
numero, compteur);
}
pthread_exit(NULL);
}
Exercice 2.
Soit le programme C suivant :
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void *fn_thread (void *inutile)
{
char chaine[128];
int e = 0;
fprintf(stdout, "Thread : entrez un nombre :");
while (fgets(chaine, 128, stdin) != NULL)
if (sscanf(chaine, "%d", &e) != 1)
fprintf(stdout, "un nombre SVP :");
else
break;
int *s=malloc(sizeof(int));
*s=e;
pthread_exit(s);
}
int main (void)
{
int i;int *s;
int ret;
void **retour;
pthread_t thread;
if ((ret = pthread_create(&thread, NULL, fn_thread, NULL)) != 0) {
fprintf(stderr, "%s\n", strerror(ret));
exit(EXIT_FAILURE);
}
pthread_join(thread, (void **) &s);
if (retour != PTHREAD_CANCELED) {
Exercice 3.
Exercice 4.
Réalisez un programme C en utilisant le mutithreading permettant de faire la maultiplication de
deux matrices A et B de N éléments. Le calcul de chaque ligne doit être effectué par un thread.
Rappel de la multiplication thread :