Thread-Safe Initialization: call_once and once_flag
By using the
std::call_once function you can register a callable. The
std::once_flag ensures that only one registered function will be invoked, but you can register additional functions via the same
std::once_flag. That being said, only one function from that group is called.
std::call_once obeys the following rules:
- Exactly one execution of exactly one of the functions is performed. It is undefined which function will be selected for execution. The selected function runs in the same thread as the
std::call_onceinvocation it was passed to.
- No invocation in the group returns before the above-mentioned execution of the selected function completes successfully.
- If the selected function exits via an exception, it is propagated to the caller. Another function is then selected and executed.
The short example demonstrates the application of
std::call_once and the
std::once_flag. Both of them are declared in the header