アップデート
ドラフト C++ 標準セクション30.4.4.1
Struct once_flagを見ると、コンストラクターが次のように定義されていることがわかります。
constexpr once_flag() noexcept;
これはconstexprであるため、静的インスタンスは静的に初期化され、静的インスタンスを使用する30.4.4.2
関数 call_onceセクションの例を見ることができます。
void g() {
static std::once_flag flag2;
std::call_once(flag2, initializer());
}
オリジナル
std::once_flagのドキュメントを見ると、次のように書かれています。
once_flag();
Cnstructs an once_flag object. The internal state is set to indicate that no function
has been called yet.
さらにcall_onceのドキュメント ドキュメントを参照すると、次の例が使用方法を示していますstd::once_flag
。
#include <iostream>
#include <thread>
#include <mutex>
std::once_flag flag;
void do_once()
{
std::call_once(flag, [](){ std::cout << "Called once" << std::endl; });
}
int main()
{
std::thread t1(do_once);
std::thread t2(do_once);
std::thread t3(do_once);
std::thread t4(do_once);
t1.join();
t2.join();
t3.join();
t4.join();
}
次の予想される出力を使用します。
Called once