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_detach (C ISO 2011)

La fonction thrd_current La fonction thrd_equal


Entête à  inclure

#include <threads.h>

Fonction thrd_detach

int thrd_detach( thrd_t threadIdentifier );

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.

Or parfois on ne veut pas se synchroniser sur la terminaison du thread. Dans ce cas, on crée le thread et on le détache. Une fois détaché, le thread libérera ses ressources à la fin de son exécution (et il n'est plus nécessaire de se synchroniser sur sa terminaison via un appel à thrd_join).

si votre thread est détaché, vous ne pourrez plus récupérer son code de sortie via un appel à thrd_join.

Comme son nom l'indique, la fonction thrd_detach permet de détacher le thread identifié en paramètre. Il faut bien comprendre que le fait de détacher le thread ne provoque pas son arrêt immédiat ! Il se poursuivra donc jusqu'à la fin de la méthode principale associée au thread ou jusqu'à un appel à thrd_exit.

Paramètre

Valeur de retour

cette fonction renvoi thrd_success si elle arrive à correctement détacher le thread, et thrd_error dans le cas contraire.

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 <stdio.h>
#include <stdlib.h>
#include <threads.h>


// La fonction sur laquelle va démarrer notre thread
int threadMain( void * data ) {

    for( int i=0; i<5; i++) {
        // On attend 1 seconde
        thrd_sleep( &(struct timespec){.tv_sec=1}, NULL );

        // On produit un affichage
        printf( "Votre thread vous dit bonjour.\n" );
    }

    // La libération peut intervenir après le return car il y a eut un appel à thrd_detach !!!
    printf( "Les ressources du threads sont libérées à partir de maintenant !\n" );
    return thrd_success;

}


int main() {

    // On crée un thread.
    thrd_t myThread;
    if ( thrd_create( &myThread, threadMain, NULL ) != thrd_success ) {
        fprintf( stderr, "Cannot create thread\n" );
        return EXIT_FAILURE;
    }

    // On détache le thread maintenant, mais il continue son exécution durant 5 secondes.
    if ( thrd_detach( myThread ) == thrd_success ) {
        printf( "Le thread est maintenant détaché\n" );
    } else {
        fprintf( stderr, "Cannot detach thread\n" );
        return EXIT_FAILURE;
    }

    // On attend 10 secondes
    thrd_sleep( &(struct timespec){.tv_sec=10}, NULL );


    // On sort du programme.
    printf( "Le thread initial/principal s'arrête.\n" );
    return EXIT_SUCCESS;

}
Fichier sample.c : exemple d'utilisation de la fonction thrd_detach

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_create
thrd_exit
thrd_join


La fonction thrd_current La fonction thrd_equal