| Defined in header <threads.h> | ||
|---|---|---|
| void call_once( once_flag* flag, void (*func)(void) ); | (1) | (since C11) | 
| typedef /* unspecified */ once_flag | (2) | (since C11) | 
| #define ONCE_FLAG_INIT /* unspecified */ | (3) | (since C11) | 
func exactly once, even if invoked from several threads. The completion of the function func synchronizes with all previous or subsequent calls to call_once with the same flag variable.call_once.once_flag.| flag | - | pointer to an object of type call_oncethat is used to ensurefuncis called only once | 
| func | - | the function to execute only once | 
(none)
The POSIX equivalent of this function is pthread_once.
#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);
}Output:
called once
| C++ documentation for call_once | 
    © cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
    https://en.cppreference.com/w/c/thread/call_once