#include <threads.h>
int thrd_create( thrd_t *thread, thrd_start_t startFunction, void * data );
Cette fonction permet de créer un nouveau thread : son exécution démarrera à partir de la fonction spécifiée en second paramètre.
Il est possible de passer des informations à la fonction associée à votre thread en utilisant le pointeur passé en dernier paramètre.
L'exécution de la function par votre nouveau thread débute dès la fin de l'appel à thrd_create
.
Conventionnellement parlant, la fonction startFunction
doit renvoyer 0 (ou la constante thrd_success
)
si tout se passe bien et une autre valeur dans le cas contraire.
Un thread est associé à des ressources du système d'exploitation. Par défaut ces ressources ne sont pas libérées à la terminaison du thread : la libération intervient après le join (fonction thrd_join ; cela permet notamment de pouvoir retrouver le code de sortie du thread) ou à la libération du processus. Si vous souhaitez libérer les ressources du thread à sa terminaison, il faut explicitement le détacher via un appel à la fonction thrd_detach.
tss_create
) accessible par votre thread
seront initialisées à NULL
.
thrd_t
qui représentera le thread nouvellement crée.
Si la création du thread se passe normalement, le contenu de la zone pointée sera donc initialisée (modifiée) pour représenter le nouveau thread.
Cet identifiant de thread peut être réutilisé pour créer un nouveau thread, mais à condition que le précédent soit terminé.
thrd_start_t
qui
est un typedef
vers int(*)(void*)
.
void *
, ce paramètre permet de passer des informations au nouveau thread. Si vous souhaitez passer une informations
simple (entier, ou chaînes de caractères), castez (transtypez) simplement votre données en (void *). Si vous souhaitez passer des données complexes, le
mieux sera de définir une structure contenant les informations utiles et de passer un pointeur vers cette structure à la fonction thrd_create
.
La fonction thrd_create
renvoie la valeur thrd_success
si la création du thread se passe correctement.
Dans le cas contraire, elle pourra retourner :
thrd_nomem
si la mémoire disponible est insuffisante.
thrd_error
dans tout autre cas d'erreur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <threads.h> bool mustExit = false; // La fonction sur laquelle vont démarrer nos deux threads int threadMain( void * data ) { const char * threadName = (const char *) data; while( ! mustExit ) { printf( "%s\n", threadName ); } printf( "%s terminé !\n", threadName ); return thrd_success; } int main() { // On crée un premier thread. thrd_t thread1; void * threadName1 = (void *) "Mon premier thread"; if ( thrd_create( &thread1, threadMain, threadName1 ) != thrd_success ) { fprintf( stderr, "Impossible de créer le premier thread\n" ); return EXIT_FAILURE; } // On crée un second thread. thrd_t thread2; void * threadName2 = (void *) "Mon second thread"; if ( thrd_create( &thread2, threadMain, threadName2 ) != thrd_success ) { fprintf( stderr, "Impossible de créer le second thread\n" ); return EXIT_FAILURE; } // Appuyez sur la touche <ENTER> pour stopper le programme. char ch; scanf( "%c", &ch ); // Tous les threads d'un même processus partagent la même zone de mémoire. // Les deux threads doivent donc voir cette variable et se suspendrent // quand cela sera nécessaire. mustExit = true; // On sort du programme. printf( "Le thread initial/principal s'arrête.\n" ); return EXIT_SUCCESS; } |
Pour compiler cet exemple sous environnement Linux/Unix, il est nécessaire de lier la librairie pthread (Posix Thread) à votre exécutable. Voici un exemple de compilation.
$> gcc -o sample sample.c -lpthread $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :