別のスレッド実行の出力をスレッドセーフに取得するためのクラスです。C++11のstd::shared_future
に似ています。
[詳解]
#include "nn/nlib/threading/Future.h"
nn::nlib::threading::detail::FutureBase< Derived >を継承しています。
template<class R>
class nn::nlib::threading::Future< R >
別のスレッド実行の出力をスレッドセーフに取得するためのクラスです。C++11のstd::shared_future
に似ています。
- テンプレート引数
-
R | 取得する値の型。voidを指定することも可能です。 |
- 説明
Future
は、Promise<R>::GetFuture()
又は、PackagedTask<T>::GetFuture()
を用いてPromise
と関連付けることができます。 Future
は内部で関数の実行スレッドと共有する領域を保有していて、関数の実行スレッドにより結果が設定された後に安全に取得できる枠組みを提供します。
- 内部では条件変数とシェアードポインタを利用した実装が行われています。 また、
PackagedTask
の説明文に簡単なコード例が示されています。
AsyncFileIo.h の 26 行目に定義があります。
◆ Get() [1/2]
内部で値となる型のオブジェクトを構築してから、Get(R* ptr)
を呼び出します。
- 戻り値
- Future の結果
- 説明
- この関数を利用した場合、
R
のコンストラクタが例外を投げる場合があることに注意してください。
更に、値取得の際のエラーを取得することができません。
Future.h の 642 行目に定義があります。
◆ Get() [2/2]
結果が取得できるまで待ってから、結果を取得します。
- 引数
-
- 戻り値
- 0ならば
ptr
に値が設定されています。それ以外の場合は(スレッドで)設定されたエラー値です。
- 説明
Future<void>
の場合は、引数を取らないGet関数が利用できます。
Future.h の 649 行目に定義があります。
◆ IsReady()
◆ IsValid()
◆ MakeSharedFrom()
同じFuture
を参照できるよう共有します。
- 引数
-
- 戻り値
- 0ならば成功
- 説明
Future
は内部に参照カウンタを持っていて、この関数を利用することで複数のスレッドから同じ結果を待つことが可能です。
- なお、
Future
クラスはコピー演算子及び代入演算子を定義していませんが、これはシェアードポインタの濫用を防ぐためです。
Future.h の 680 行目に定義があります。
◆ Then()
template<class R>
template<class RNEXT >
このフューチャーに対して引き続き行う処理(continuation)を登録します。
- テンプレート引数
-
- 引数
-
[out] | next | continuationに対するFuture型 |
[in] | cont | continuationとして登録する関数 |
- 戻り値
-
0 | 成功しました。 |
EINVAL | 自身(Future)がpromiseに関連付けられていない場合 |
ENOMEM | メモリが足りない場合 |
その他 | 下部レイヤからのエラーが返されることがあります。 |
- 説明
- 非同期プログラミングでは、非同期的な実行の完了時に次の処理を起動しデータを渡したい場合があります。
Future
を待つ方法もありますが、Then()
を利用することで引き続き行う処理を非同期処理に関連付けることが可能です。
Then()
を利用することにより、メインスレッドがサブスレッド処理の途中経過を適宜受け取る、というような処理を自然に記述できるようになります。
Future.h の 677 行目に定義があります。
◆ WaitFor()
指定された期間の間、結果が取得できる状態になるまで待ちます。
- 引数
-
- 戻り値
-
0 | 結果が取得できます。 |
ETIMEDOUT | タイムアウトが発生しました。 |
- 説明
if (future.WaitFor(TimeSpan(0, 0, 10)) == 0) {
result = future.Get();
}
Future.h の 670 行目に定義があります。
◆ WaitUntil()
指定された時刻までの間、結果が取得できる状態になるまで待ちます。
- 引数
-
- 戻り値
-
0 | 結果が取得できます。 |
ETIMEDOUT | タイムアウトが発生しました。 |
Future.h の 673 行目に定義があります。
このクラス詳解は次のファイルから抽出されました: