call_once, once_flag, ONCE_FLAG_INIT
From cppreference.com
                    
                                        
                    
                    
                                                            
                    |   Defined in header  
<threads.h>
  | 
||
|   void call_once( once_flag* flag, void (*func)(void) ); 
 | 
(1) | (since C11) | 
|   typedef once_flag /* unspecified */ 
 | 
(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.
Contents | 
[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] See also
|   
C++ documentation for call_once
 
 | 
[edit] 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)