初期化処理などある処理を一度だけ呼び出して以降は呼び出さなくするやり方
以下の例ではSomeFunc()という関数の呼び出しの際に最初の一度だけinit()という関数を呼び出したい場合の例です。
#include <iostream>
#include <mutex>
void init (const int num) {
std::cout << "init(" << std::to_string(num) << ") called" << std::endl;
}
void SomeFunc() {
static std::once_flag flag;
std::call_once(flag, init, 10);
std::cout << "SomeFunc() called" << std::endl;
}
int main() {
SomeFunc();
SomeFunc();
SomeFunc();
}
SomeFunc() 関数にstaticな変数flagを持たせて、call_onceでinit()関数を呼び出すかどうかのチェックをしています。
実行結果は以下の通り
init(10) called SomeFunc() called SomeFunc() called SomeFunc() called
SomeFunc()は3回呼ばれていますが、SomeFunc()の中でcall_once()経由で呼び出されるinit()は一度しか呼び出されていないのが分かります。