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 :

Type once_flag

Entête à inclure

#include <threads.h>

Type once_flag

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.

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 
#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;
}
Fichier sample.c : exemple d'utilisation de la fonction call_once

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

call_once
ONCE_FLAG_INIT