std::future
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <future> で定義
|
||
template< class T > class future; |
(1) | (C++11以上) |
template< class T > class future<T&>; |
(2) | (C++11以上) |
template<> class future<void>; |
(3) | (C++11以上) |
クラステンプレート std::future は非同期操作の結果にアクセスするための仕組みを提供します。
- (std::async, std::packaged_task, std::promise を通して作成される) 非同期操作は、その非同期操作の作成者に
std::futureオブジェクトを提供します。
- 非同期操作の作成者は、
std::futureから値を取り出したり、問い合わせたり、待機したりするために様々なメソッドを使用することができます。 非同期操作がまだ値を提供していなければ、これらのメソッドはブロックされる場合があります。
- 非同期操作が作成者に結果を送信する準備ができたとき、その作成者の
std::futureにリンクされている「共有状態」を変更することで、それを行うことができます (std::promise::set_value など)。
std::future が参照する共有状態は (std::shared_future とは異なり) いかなる他の非同期リターンオブジェクトとも共有しません。
メンバ関数
| フューチャーオブジェクトを構築します (パブリックメンバ関数) | |
| フューチャーオブジェクトを破棄します (パブリックメンバ関数) | |
| フューチャーオブジェクトをムーブします (パブリックメンバ関数) | |
共有状態を *this から shared_future に転送し、それを返します (パブリックメンバ関数) | |
結果の取得 | |
| 結果を返します (パブリックメンバ関数) | |
状態 | |
| フューチャーが共有状態を持っているかどうか調べます (パブリックメンバ関数) | |
| 結果が利用可能になるのを待ちます (パブリックメンバ関数) | |
| 結果を待ちます。 指定されたタイムアウト期間が満了するまで利用可能にならなければリターンします (パブリックメンバ関数) | |
| 結果を待ちます。 指定時刻に達するまで利用可能にならなければリターンします (パブリックメンバ関数) | |
例
Run this code
#include <iostream>
#include <future>
#include <thread>
int main()
{
// packaged_task からフューチャーを取得します。
std::packaged_task<int()> task([]{ return 7; }); // 関数をラップ
std::future<int> f1 = task.get_future(); // フューチャーを取得
std::thread t(std::move(task)); // スレッドを起動
// async() からフューチャーを取得します。
std::future<int> f2 = std::async(std::launch::async, []{ return 8; });
// プロミスからフューチャーを取得します。
std::promise<int> p;
std::future<int> f3 = p.get_future();
std::thread( [&p]{ p.set_value_at_thread_exit(9); }).detach();
std::cout << "Waiting..." << std::flush;
f1.wait();
f2.wait();
f3.wait();
std::cout << "Done!\nResults are: "
<< f1.get() << ' ' << f2.get() << ' ' << f3.get() << '\n';
t.join();
}
出力:
Waiting...Done!
Results are: 7 8 9
関連項目
(C++11) |
(場合によっては新しいスレッドで) 非同期に関数を実行し、その結果を保持する std::future を返します (関数テンプレート) |
(C++11) |
(他のフューチャーからも参照される可能性がある) 非同期に設定される値を待ちます (クラステンプレート) |