nlib
nn::nlib::threading::Future< R > クラステンプレート

別のスレッド実行の出力をスレッドセーフに取得するためのクラスです。C++11のstd::shared_futureに似ています。 [詳解]

#include "nn/nlib/threading/Future.h"

nn::nlib::threading::detail::FutureBase< Derived >を継承しています。

公開メンバ関数

Get ()
 内部で値となる型のオブジェクトを構築してから、Get(R* ptr)を呼び出します。 [詳解]
 
errno_t Get (R *ptr)
 結果が取得できるまで待ってから、結果を取得します。 [詳解]
 
bool IsValid () const noexcept
 FuturePromiseと関連付けられているかどうかを返します。 [詳解]
 
bool IsReady () const noexcept
 Future に値が設定されている(Promiseが値かエラーを設定した)かどうかを返します。 [詳解]
 
errno_t Wait () noexcept
 結果が取得できる状態になるまで待ちます。
 
errno_t WaitFor (const TimeSpan &span) noexcept
 指定された期間の間、結果が取得できる状態になるまで待ちます。 [詳解]
 
errno_t WaitUntil (const DateTime &datetime) noexcept
 指定された時刻までの間、結果が取得できる状態になるまで待ちます。 [詳解]
 
template<class RNEXT >
errno_t Then (Future< RNEXT > *next, RNEXT(*cont)(Future< R > &)) noexcept
 このフューチャーに対して引き続き行う処理(continuation)を登録します。 [詳解]
 
errno_t MakeSharedFrom (const Future &f) noexcept
 同じFutureを参照できるよう共有します。 [詳解]
 
基本的なメンバ関数
 Future () noexcept
 デフォルトコンストラクタです。
 
Futureassign (Future &rhs, move_tag)
 swapを利用したムーブにより代入します。
 
 Future (Future &rhs, move_tag)
 swapを利用したムーブによりオブジェクトを構築します。
 
 Future (Future &&rhs)
 ムーブコンストラクタです。C++11の利用時に有効です。
 
Futureoperator= (Future &&rhs)
 ムーブ代入演算子です。C++11の利用時に有効です。
 

詳解

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.h13 行目に定義があります。

関数詳解

template<class R>
nn::nlib::threading::Future< R >::Get ( )
inline

内部で値となる型のオブジェクトを構築してから、Get(R* ptr)を呼び出します。

戻り値
Future の結果
説明
この関数を利用した場合、Rのコンストラクタが例外を投げる場合があることに注意してください。
更に、値取得の際のエラーを取得することができません。

Future.h512 行目に定義があります。

template<class R>
nn::nlib::threading::Future< R >::Get ( R *  ptr)
inline

結果が取得できるまで待ってから、結果を取得します。

引数
[in,out]ptr値が設定されるポインタ
戻り値
0ならばptrに値が設定されています。それ以外の場合は(スレッドで)設定されたエラー値です。
説明
Future<void>の場合は、引数を取らないGet関数が利用できます。

Future.h519 行目に定義があります。

template<class R>
nn::nlib::threading::Future< R >::IsReady ( ) const
inlinenoexcept

Future に値が設定されている(Promiseが値かエラーを設定した)かどうかを返します。

戻り値
trueならば値が設定されています。

Future.h538 行目に定義があります。

template<class R>
nn::nlib::threading::Future< R >::IsValid ( ) const
inlinenoexcept

FuturePromiseと関連付けられているかどうかを返します。

戻り値
trueならばPromiseと関連付けられています。

Future.h537 行目に定義があります。

template<class R>
nn::nlib::threading::Future< R >::MakeSharedFrom ( const Future< R > &  f)
inlinenoexcept

同じFutureを参照できるよう共有します。

引数
[in]f共有するFutureオブジェクト
戻り値
0ならば成功
説明
Futureは内部に参照カウンタを持っていて、この関数を利用することで複数のスレッドから同じ結果を待つことが可能です。
なお、Futureクラスはコピー演算子及び代入演算子を定義していませんが、これはシェアードポインタの濫用を防ぐためです。

Future.h548 行目に定義があります。

template<class R>
template<class RNEXT >
nn::nlib::threading::Future< R >::Then ( Future< RNEXT > *  next,
RNEXT(*)(Future< R > &)  cont 
)
inlinenoexcept

このフューチャーに対して引き続き行う処理(continuation)を登録します。

テンプレート引数
RNEXTcontinuationの戻り値型
引数
[out]nextcontinuationに対するFuture型
[in]contcontinuationとして登録する関数
戻り値
0成功しました。
EINVAL自身(Future)がpromiseに関連付けられていない場合
ENOMEMメモリが足りない場合
その他下部レイヤからのエラーが返されることがあります。
説明
非同期プログラミングでは、非同期的な実行の完了時に次の処理を起動しデータを渡したい場合があります。 Futureを待つ方法もありますが、Then()を利用することで引き続き行う処理を非同期処理に関連付けることが可能です。
Then()を利用することにより、メインスレッドがサブスレッド処理の途中経過を適宜受け取る、というような処理を自然に記述できるようになります。

Future.h545 行目に定義があります。

template<class R>
nn::nlib::threading::Future< R >::WaitFor ( const TimeSpan span)
inlinenoexcept

指定された期間の間、結果が取得できる状態になるまで待ちます。

引数
[in]spanウェイトする期間
戻り値
0結果が取得できます。
ETIMEDOUTタイムアウトが発生しました。
説明
// 別スレッドの実行結果を10ミリ秒待ちます。
if (future.WaitFor(TimeSpan(0, 0, 10)) == 0) {
result = future.Get();
}

Future.h540 行目に定義があります。

template<class R>
nn::nlib::threading::Future< R >::WaitUntil ( const DateTime datetime)
inlinenoexcept

指定された時刻までの間、結果が取得できる状態になるまで待ちます。

引数
[in]datetimeウェイト期限となる時刻
戻り値
0結果が取得できます。
ETIMEDOUTタイムアウトが発生しました。

Future.h541 行目に定義があります。


このクラス詳解は次のファイルから抽出されました: