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つの宣言です.
promiseこのオブジェクトは、futureオブジェクトによって取得できるTタイプの値を保存します(この取得プロセスは別のスレッドで発生する可能性があります).このクラスは同期メカニズムを提供します.
futureヘッダファイルは、特定のプロバイダによって設定された値に非同期でアクセスできる便利さを提供し、プロバイダとアクセス者は異なるスレッドで、異なるスレッド間の同期を保証します.アクセス者は、プロバイダ(promiseなど)が提供するfutureオブジェクトを使用して共有ステータス(値)にアクセスできます.ヘッダファイルには、次のクラスと関数が含まれています.
futureオブジェクトは、他のプロバイダオブジェクトまたは関数から値を取得できます.合法(valid)のfuturesは、共有状態に関連付けられたいくつかのfuturesオブジェクトであり、以下の関数で取得することができる.
合法的な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;
}