Namespaces
Variants

call_once, once_flag, ONCE_FLAG_INIT

From cppreference.net
Défini dans l'en-tête <threads.h>
void call_once ( once_flag * flag, void ( * func ) ( void ) ) ;
(1) (depuis C11)
typedef /* non spécifié */ once_flag
(2) (depuis C11)
#define ONCE_FLAG_INIT /* non spécifié */
(3) (depuis C11)
1) Appelle la fonction func exactement une fois, même si elle est invoquée depuis plusieurs threads. L'achèvement de la fonction func se synchronise avec tous les appels précédents ou ultérieurs à call_once avec la même variable flag .
2) Type d'objet complet capable de contenir un indicateur utilisé par call_once .
3) S'étend à une valeur qui peut être utilisée pour initialiser un objet de type once_flag .

Table des matières

Paramètres

flag - pointeur vers un objet de type call_once utilisé pour garantir que func n'est appelée qu'une seule fois
func - la fonction à exécuter une seule fois

Valeur de retour

(aucun)

Notes

L'équivalent POSIX de cette fonction est pthread_once .

Exemple

#include <stdio.h>
#include <threads.h>
void do_once(void) {
    puts("called once");
}
static once_flag flag = ONCE_FLAG_INIT;
int func(void* data)
{
    call_once(&flag, do_once);
}
int main(void)
{
    thrd_t t1, t2, t3, t4;
    thrd_create(&t1, func, NULL);
    thrd_create(&t2, func, NULL);
    thrd_create(&t3, func, NULL);
    thrd_create(&t4, func, NULL);
    thrd_join(t1, NULL);
    thrd_join(t2, NULL);
    thrd_join(t3, NULL);
    thrd_join(t4, NULL);
}

Sortie :

called once

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.26.2.1 La fonction call_once (p: 275)
  • 7.26.1/3 ONCE_FLAG_INIT (p: 274)
  • Norme C11 (ISO/IEC 9899:2011):
  • 7.26.2.1 La fonction call_once (p: 378)
  • 7.26.1/3 ONCE_FLAG_INIT (p: 376)

Voir aussi

Documentation C++ pour call_once