call_once, once_flag, ONCE_FLAG_INIT
Von cppreference.com
| 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
Führen Sie diesen Code aus
#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
|