# call_once, once_flag, ONCE_FLAG_INIT

From cppreference.com
< c‎ | thread

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`.

### Parameters

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

(none)

### Notes

The POSIX equivalent of this function is pthread_once.

### Example

Run this code

    #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

### References

- C11 standard (ISO/IEC 9899:2011):

  - 7.26.2.1 The call_once function (p: 378)

  - 7.26.1/3 ONCE_FLAG_INIT (p: 376)

### See also

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=c/thread/call_once&oldid=90364"