#include <threads.h>
typedef struct { int __data __ONCE_ALIGNMENT; } once_flag;
Ce type de données (plus précisément, une structure) permet de mémoriser si une fonction a déjà été appelée par la fonction
call_once
ou non. Une variable basée sur ce type doit impérativement être initialisée avec la constante
(en fait une macro) ONCE_FLAG_INIT
.
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 |
#include <stdio.h> #include <stdlib.h> #include <threads.h> #define THREAD_COUNT 4 // Une fonction qui ne doit pas être invoquée plus qu'une unique fois. void doOnlyOnceTime(void) { printf( "Cette fonction est invoquée qu'une unique fois !\n" ); } // Définition de la fonction sur laquelle amorcer tous nos threads. int threadFuntion(void* data) { // Une variable locale statique est une variable dont la durée de vie // est l'application mais qui n'est accessible que dans cette fonction. static once_flag flag = ONCE_FLAG_INIT; long index = (long) data; printf( "Thread %ld démarré.\n", index ); // Appel sécurisé à la fonction call_once( &flag, doOnlyOnceTime ); return thrd_success; } int main() { // On démarre tous nos threads sur la fonction définie ci-dessus. thrd_t threads[THREAD_COUNT]; for( long i=0; i<THREAD_COUNT; i++ ) { thrd_create( &threads[i], threadFuntion, (long *)i ); } // On attend la terminaison de tous nos threads. for( int i=0; i<THREAD_COUNT; i++ ) { thrd_join( threads[i], NULL ); } 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 :