• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function template
    <mutex>

    std::call_once

    namespace std {
      template <class Callable, class ...Args>
      void call_once(once_flag& flag, Callable func, Args&&... args);
    }
    

    概要

    指定された関数を一度だけ呼び出す。

    この関数は主に、複数スレッド間で共通使用するデータの初期化処理などで使用する。

    効果

    パラメータflagが初期状態であれば、func関数オブジェクトにargs...を適用して呼び出し、そうでなければfunc関数オブジェクトを呼び出さない。

    func関数オブジェクトの呼び出しが例外を送出する場合、その例外はcall_once()関数の呼び出し元に伝達され、パラメータflagは初期状態のままとなる。

    戻り値

    なし

    例外

    • システムのAPIで何らかのエラーが発生した場合、system_error例外が送出される。
    • func関数オブジェクトの呼び出しによって送出される、あらゆる例外が送出される可能性がある。

    備考

    func関数オブジェクトの呼び出しが例外を送出した場合、同じパラメータflagを指定した次のcall_onceにて関数オブジェクトが呼び出される。また、同じパラメータflagを指定した複数call_once()において、指定された各関数オブジェクトの呼び出しは同時に行われない。(全順序が保証される)

    #include <iostream>
    #include <thread>
    #include <mutex>
    
    std::once_flag once;
    
    void init()
    {
      // 初期化を行う...
      std::cout << "initialize" << std::endl;
    }
    
    void thread_proc()
    {
      std::call_once(once, init);
    }
    
    int main()
    {
      std::thread t1(thread_proc);
      std::thread t2(thread_proc);
      std::thread t3(thread_proc);
    
      t1.join();
      t2.join();
      t3.join();
    }
    

    出力

    initialize
    

    バージョン

    言語

    • C++11

    処理系

    参照

    • LWG Issue 2080. Specify when once_flag becomes invalid
      • C++11では、once_flagが無効(invalid)な場合にsystem_errorが送出される仕様になっていた。実際には、once_flagが無効になる状況はないため、C++14でこの例外仕様が削除された。