LinuxでのC++マルチスレッドプログラミング(std::future)

1880 ワード

futureヘッダファイル
futureヘッダファイルは、特定のプロバイダによって設定された値に非同期でアクセスできる便利さを提供し、プロバイダとアクセス者は異なるスレッドで、異なるスレッド間の同期を保証します.アクセス者は、プロバイダ(promiseなど)が提供するfutureオブジェクトを使用して共有ステータス(値)にアクセスできます.ヘッダファイルには、次のクラスと関数が含まれています.
  • Providerクラス:std::promise,std::package_task
  • Futureクラス:std::future,shared_future
  • Provider関数:std::async()
  • その他
  • std::future
    futureオブジェクトは、他のプロバイダオブジェクトまたは関数から値を取得できます.合法(valid)のfuturesは、共有状態に関連付けられたいくつかのfuturesオブジェクトであり、以下の関数で取得することができる.
  • async
  • promise::get_future
  • packaged_task::get_future

  • 合法的なfutureオブジェクトだけが役に立つことを覚えておいてください.デフォルトのコンストラクション関数を使用して作成されたfutureオブジェクトは合法的ではありません(割り当てを転送することによって合法的なfutureオブジェクトを割り当てない限り)、つまり直接定義されたfutureオブジェクトは役に立たないということです.合法的なfutureオブジェクトのfuture::get関数はブロックスレッドを作成し、プロバイダを待って共有状態をreadyにします.
    共有状態のライフサイクルは、それに関連する最後のオブジェクトが解放または破棄されるまで継続します.
    std::promise
    promiseはテンプレートクラスで、次はその3つの宣言です.
    template  promise;
    template  promise;    //T     
    template <> promise    // T    void  
    

    promiseこのオブジェクトは、futureオブジェクトによって取得できるTタイプの値を保存します(この取得プロセスは別のスレッドで発生する可能性があります).このクラスは同期メカニズムを提供します.
    #include 
    #include    //std::ref
    #include 
    #include 
    
    void print_int(std::future& fut)
    {
        int x = fut.get();    //         ready,        ,       ready 
        std::cout << "value: " << x << std::endl;
    }
    
    int main()
    {
        std::promise prom;
        
        std::future fut = prom.get_future();  //    future   promise         
        std::thread th1 (print_int, std::ref(fut));   //          future         
        prom.set_value(10);      // set_value      ,  promise         ready
        
        th1.join();
        
        return 0;
    }