Namensräume
Varianten
Aktionen

call_once, once_flag, ONCE_FLAG_INIT

Von cppreference.com
< c‎ | thread
Definiert im Header <threads.h>
void call_once( once_flag* flag, void (*func)(void) );
(1) (seit C11)
typedef /* nicht spezifiziert */ once_flag
(2) (seit C11)
#define ONCE_FLAG_INIT /* nicht spezifiziert */
(3) (seit C11)
1) Ruft die Funktion func genau einmal auf, auch wenn sie von mehreren Threads aus aufgerufen wird. Der Abschluss der Funktion func synchronisiert sich mit allen vorherigen oder nachfolgenden Aufrufen von call_once mit derselben flag-Variable.
2) Ein vollständiger Objekttyp, der ein von call_once verwendetes Flag speichern kann.
3) Erweitert sich zu einem Wert, der zur Initialisierung eines Objekts vom Typ once_flag verwendet werden kann.

Inhalt

[bearbeiten] Parameter

flag - Zeiger auf ein Objekt vom Typ call_once, das verwendet wird, um sicherzustellen, dass func nur einmal aufgerufen wird
func - die Funktion, die nur einmal ausgeführt werden soll

[bearbeiten] Rückgabewert

(keine)

[bearbeiten] Hinweise

Das POSIX-Äquivalent dieser Funktion ist pthread_once.

[bearbeiten] Beispiel

#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);
}

Ausgabe

called once

[bearbeiten] Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 7.26.2.1 Die Funktion call_once (S. 275)
  • 7.26.1/3 ONCE_FLAG_INIT (S. 274)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.26.2.1 Die Funktion call_once (S. 378)
  • 7.26.1/3 ONCE_FLAG_INIT (S. 376)

[bearbeiten] Siehe auch

C++ Dokumentation für call_once