Rechercher
 

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 :

Fonction thrd_create (C ISO 2011)

La fonction call_once La fonction thrd_current


La vidéo


Introduction à la programmation multi-threads avec le langage C

Entête à  inclure

#include <threads.h>

Fonction thrd_create

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.

Toutes les valeurs de type « thread-specific storage » (voir la fonction tss_create) accessible par votre thread seront initialisées à NULL.

Paramètres

Valeur de retour

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 :

Exemple de code

 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;
}
Fichier sample.c : exemple de démarrage de deux threads.

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
$>

Fonctions et types connexes

thrd_busy, thrd_error, thrd_nomem, thrd_success, thrd_timedout
thrd_detach
thrd_exit
thrd_join


La fonction call_once La fonction thrd_current