nlib
nn::nlib::threading::PackagedTask< T > クラステンプレート

関数をラップし、別スレッドで実行し戻り値をスレッドセーフに取得できるようにするクラスです。C++11のstd::packaged_taskに似ています。 [詳解]

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

公開型

typedef PackagedTask< T > ThisType
 このオブジェクトの型です。
 

公開メンバ関数

 PackagedTask () noexcept
 デフォルトコンストラクタです。
 
template<class FUNC >
errno_t Init (FUNC &func)
 初期化を行います。 [詳解]
 
template<class R >
errno_t GetFuture (Future< R > *p) noexcept
 実行結果を取得するためのFutureを設定します。 [詳解]
 
void swap (PackagedTask &rhs) noexcept
 スワップします。 [詳解]
 

詳解

template<class T>
class nn::nlib::threading::PackagedTask< T >

関数をラップし、別スレッドで実行し戻り値をスレッドセーフに取得できるようにするクラスです。C++11のstd::packaged_taskに似ています。

テンプレート引数
T関数の型。int(int, int)のように記述して実体化します。引数は5つまで可能で、void型の戻り値もサポートされています。
説明
引数が5つまでの関数に対応しています。 それぞれ、arg1, arg2, arg3, arg4, arg5というデータメンバにアクセスが可能です。
以下のようにテンプレートを実体化して利用します。
int myplus(int x, int y) { return x + y; }
.....
PackagedTask<int(int, int)> task(myplus);
int arg1 = ....;
int arg2 = ....;
Future<int> myfuture;
task.GetFuture(&myfuture);
Thread th;
th.Start(task, arg1, arg2, nn::nlib::move_tag());
th.Join(); // 先にjoinしても後にjoinしてもdetachしてもよい
int result = myfuture.Get(); // 関数の実行結果を得る

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

関数詳解

§ GetFuture()

template<class T>
template<class R >
nn::nlib::threading::PackagedTask< T >::GetFuture ( Future< R > *  p)
noexcept

実行結果を取得するためのFutureを設定します。

テンプレート引数
R戻り値の型です。
引数
[in]pFutureへのポインタ
戻り値
0成功した場合
EINVALpNULLの場合
ENOMEM値を格納するメモリの確保に失敗した場合
説明
オブジェクト内部で保有しているPromiseからFutureを取得しています。 FutureからはPackagedTaskが実行する関数の実行終了直後から結果を取得することができます。 スレッドがJoinしていてもいなくても、スレッドがDetachされていても取得することができます。

§ Init()

template<class T>
template<class FUNC >
nn::nlib::threading::PackagedTask< T >::Init ( FUNC &  func)

初期化を行います。

テンプレート引数
FUNC関数ポインタ等呼び出し可能なオブジェクトの型
引数
[in]func関数ポインタ等呼び出し可能なオブジェクト
戻り値
0ならば成功

§ swap()

template<class T>
nn::nlib::threading::PackagedTask< T >::swap ( PackagedTask< T > &  rhs)
noexcept

スワップします。

引数
[in]rhsスワップするオブジェクト

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