#include <threads.h>
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).
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.
threadIdentifier : l'identifiant du thread à détacher.
cette fonction renvoi thrd_success
si elle arrive à correctement détacher le thread, et thrd_error
dans le cas contraire.
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; } |
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 :