call_once, once_flag, ONCE_FLAG_INIT
From cppreference.com
C
Concurrency support (C11)
Concurrency support library
Threads
Atomic operations
(until C23)
Atomic flags
Memory ordering
Mutual exclusion
Condition variables
Thread-local storage
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
.[edit] 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
[edit] Return value
(none)
[edit] Notes
The POSIX equivalent of this function is pthread_once
.
[edit] 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
[edit] References
- C17 standard (ISO/IEC 9899:2018):
- 7.26.2.1 The call_once function (p: 275)
- 7.26.1/3 ONCE_FLAG_INIT (p: 274)
- 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)
[edit] See also
C++ documentation for call_once