|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 functionfunc synchronizes with all previous or subsequent calls tocall_once with the sameflag variable.call_once.once_flag.Contents |
| flag | - | pointer to an object of typecall_once that is used to ensurefunc is called only once |
| func | - | the function to execute only once |
(none)
The POSIX equivalent of this function ispthread_once.
#include <stdio.h>#include <threads.h> void do_once(void){puts("called once");} staticonce_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 forcall_once |