Différences entre versions de « C pthread »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
(Page créée avec « = Introduction = Les thread ou ''processus légers'' sont utilisés pour paralléliser l'exécution dans un programme. Ils sont dit ''légers'' car ils s'exécutent dans l... »)
 
Ligne 35 : Ligne 35 :
 
}
 
}
 
</source>
 
</source>
 +
Dans cette exemple nous utilisons la fonction suivante:
 +
<source lang='c'>
 +
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
 +
</source>
 +
* ''*thread'' est une référence vers la variable qui va contenir le thread;
 +
* ''*attr'' correspond aux arguments de création du thread, passer à la fonction ''pthread_create'';
 +
* ''*(*start_routine)'' est un pointeur vers la fonction exécutée par le thread;
 +
* ''*arg'' est un pointeur vers les arguments passés en paramètre à la fonction ''start_routine'';
 +
Lorsque l'on exécute cet exemple on à le résultat suivant :
 +
<pre>
 +
Avant la création du thread.
 +
Après la création du thread.
 +
</pre>
 +
On ne voit pas le message du thread car le programme se termine sans attendre la fin de son exécution. Pour attendre la fin de l'exécution du thread, il faut utiliser la fonction suivante :
 +
<source lang='c'>
 +
int pthread_join(pthread_t thread, void **retval);
 +
</source>
 +
* ''*thread'' est une référence vers la variable qui va contenir le thread;
 +
* ''**retval'' est un pointeur vers un entier qui contiendra la valeur de retour du thread;
 +
Ajoutez la ligne suivante :
 +
<source lang='c'>
 +
pthread_join(thread1, NULL);
 +
</source>
 +
Après l'appel de la fonction ''pthread_create'' pour avoir le résultat suivant:
 +
<pre>
 +
Avant la création du thread.
 +
Nous sommes dans le thread.
 +
Après la création du thread.
 +
</pre>
 +
= Modification d'un variable =

Version du 21 septembre 2018 à 19:39

Introduction

Les thread ou processus légers sont utilisés pour paralléliser l'exécution dans un programme. Ils sont dit légers car ils s'exécutent dans le même contexte que le processus d'exécution principal qui les créés et consomme donc moins de mémoire / CPU.

Pré-requis

Pour pouvoir créer des threads il faut utiliser la librairie pthread (POSIX thread):

#include <pthread.h>

Ce qui donne en ligne de commande:

gcc -lpthread thread_exemple.c

Pour inclure la librairie dans Eclispe regardez ici.

Premier thread

Dans ce premier exemple nous allons créer un thread qui affiche une message:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *thread_1(void *arg) {
	printf("Nous sommes dans le thread.\n");
	// Arrêt propre du thread
	pthread_exit(NULL);
}

int main(void) {
	// Création de la variable qui va contenir le thread
	pthread_t thread1;
	printf("Avant la création du thread.\n");
	// Création du thread
	pthread_create(&thread1, NULL, thread_1, NULL);
	printf("Après la création du thread.\n");
	return EXIT_SUCCESS;
}

Dans cette exemple nous utilisons la fonction suivante:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
  • *thread est une référence vers la variable qui va contenir le thread;
  • *attr correspond aux arguments de création du thread, passer à la fonction pthread_create;
  • *(*start_routine) est un pointeur vers la fonction exécutée par le thread;
  • *arg est un pointeur vers les arguments passés en paramètre à la fonction start_routine;

Lorsque l'on exécute cet exemple on à le résultat suivant :

Avant la création du thread.
Après la création du thread.

On ne voit pas le message du thread car le programme se termine sans attendre la fin de son exécution. Pour attendre la fin de l'exécution du thread, il faut utiliser la fonction suivante :

int pthread_join(pthread_t thread, void **retval);
  • *thread est une référence vers la variable qui va contenir le thread;
  • **retval est un pointeur vers un entier qui contiendra la valeur de retour du thread;

Ajoutez la ligne suivante :

pthread_join(thread1, NULL);

Après l'appel de la fonction pthread_create pour avoir le résultat suivant:

Avant la création du thread.
Nous sommes dans le thread.
Après la création du thread.

Modification d'un variable