call_once, once_flag, ONCE_FLAG_INIT

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)
1) Calls function 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.
2) Complete object type capable of holding a flag used by call_once
3) Expands to a value that can be used to initialize an object of type once_flag.


flag - pointer to an object of type call_once that is used to ensure func is called only once
func - the function to execute only once

Return value



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


called once


  • C11 standard (ISO/IEC 9899:2011):
    • The call_once function (p: 378)
    • 7.26.1/3 ONCE_FLAG_INIT (p: 376)

See also

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.