nlib
nn::nlib::threading::Thread クラスfinal

スレッドの生成・開始を行うためのクラスです。 [詳解]

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

公開型

typedef void(* ThreadFunc) (void *arg)
 スレッドで実行する関数のtypedefです。
 

公開メンバ関数

errno_t Join () noexcept
 スレッドの実行完了を待ちます。 [詳解]
 
errno_t Detach () noexcept
 スレッドをデタッチします。 [詳解]
 
bool IsJoinable () const noexcept
 join可能かどうか調べます。 [詳解]
 
errno_t GetPriority (int32_t *priority) noexcept
 スレッドの優先度を取得します。 [詳解]
 
errno_t ChangePriority (int32_t priority) noexcept
 スレッドの優先度を設定します。 [詳解]
 
errno_t SetAffinity (uint32_t affinity) noexcept
 スレッドのプロセッサアフィニティマスクを設定します。 [詳解]
 
nlib_thread GetNativeHandle () const noexcept
 実装依存のスレッド識別子を取得します。 [詳解]
 
基本的なメンバ関数
constexpr Thread () noexcept
 デフォルトコンストラクタです。
 
 ~Thread () noexcept
 デストラクタです。スレッドがJoinされていない場合はJoinします。
 
Threadassign (Thread &rhs, move_tag)
 swapを利用したムーブにより代入します。
 
 Thread (Thread &rhs, move_tag)
 swapを利用したムーブによりオブジェクトを構築します。
 
 Thread (Thread &&rhs)
 ムーブコンストラクタです。C++11の利用時に有効です。
 
Threadoperator= (Thread &&rhs)
 ムーブ代入演算子です。C++11の利用時に有効です。
 
void swap (Thread &rhs) noexcept
 オブジェクトの内容をスワップします。
 
bool operator== (const Thread &rhs) noexcept
 nlib_thread_equal()を用いてスレッドを比較します。
 
bool operator!= (const Thread &rhs) noexcept
 nlib_thread_equal()を用いてスレッドを比較します。
 
ポインタを直接渡してスレッドを起動するメンバ
errno_t StartRaw (ThreadFunc func, void *arg) noexcept
 void*型の引数を1つもつ関数を別スレッドで実行開始します。 [詳解]
 
errno_t StartRaw (ThreadFunc func, void *arg, const ThreadSettings &settings) noexcept
 void*型の引数を1つもつ関数を別スレッドで実行開始します。 [詳解]
 
errno_t StartRaw (const ThreadSettings &settings, ThreadArg<>::Func func) noexcept
 引数を持たない関数を別スレッドで実行開始します。 [詳解]
 
errno_t StartRaw (ThreadArg<>::Func func) noexcept
 引数を持たない関数を別スレッドで実行開始します。 [詳解]
 
template<class ThArg >
errno_t StartRaw (const ThreadSettings &settings, UniquePtr< ThArg > &ptr) noexcept
 別スレッドの実行を開始します。 [詳解]
 
template<class ThArg >
errno_t StartRaw (UniquePtr< ThArg > &ptr) noexcept
 別スレッドの実行を開始します。 [詳解]
 
引数なしの関数や関数オブジェクトを起動するメンバ
template<class FUNC >
errno_t Start (const ThreadSettings &settings, const FUNC &f, move_tag)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC >
errno_t Start (const FUNC &f, move_tag)
 引数を持たない関数を別スレッドで実行開始します。 引数を持たないこと以外は、引数が1つのバージョンと同じです。
 
template<class FUNC >
errno_t Start (const ThreadSettings &settings, const FUNC &f)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC >
errno_t Start (const FUNC &f)
 引数を持たない関数を別スレッドで実行開始します。 [詳解]
 
引数1つを受け取る関数や関数オブジェクトを起動するメンバ
template<class FUNC , class T1 >
errno_t Start (const ThreadSettings &settings, const FUNC &f, const T1 &arg1, move_tag)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC , class T1 >
errno_t Start (const FUNC &f, const T1 &arg1, move_tag)
 引数を1つもつ関数を別スレッドで実行開始します。 [詳解]
 
template<class FUNC , class T1 >
errno_t Start (const ThreadSettings &settings, const FUNC &f, const T1 &arg1)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC , class T1 >
errno_t Start (const FUNC &f, const T1 &arg1)
 引数を1つもつ関数を別スレッドで実行開始します。 [詳解]
 
引数2つを受け取る関数や関数オブジェクトを起動するメンバ
template<class FUNC , class T1 , class T2 >
errno_t Start (const ThreadSettings &settings, const FUNC &f, const T1 &arg1, const T2 &arg2, move_tag)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC , class T1 , class T2 >
errno_t Start (const FUNC &f, const T1 &arg1, const T2 &arg2, move_tag)
 引数を2つもつ関数を別スレッドで実行開始します。 引数を2つ持つこと以外は、引数が1つのバージョンと同じです。
 
template<class FUNC , class T1 , class T2 >
errno_t Start (const ThreadSettings &settings, const FUNC &f, const T1 &arg1, const T2 &arg2)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC , class T1 , class T2 >
errno_t Start (const FUNC &f, const T1 &arg1, const T2 &arg2)
 引数を2つもつ関数を別スレッドで実行開始します。引数を2つ持つこと以外は、引数が1つのバージョンと同じです。
 
引数3つを受け取る関数や関数オブジェクトを起動するメンバ
template<class FUNC , class T1 , class T2 , class T3 >
errno_t Start (const ThreadSettings &settings, const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3, move_tag)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC , class T1 , class T2 , class T3 >
errno_t Start (const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3, move_tag)
 引数を3つもつ関数を別スレッドで実行開始します。 引数を3つ持つこと以外は、引数が1つのバージョンと同じです。
 
template<class FUNC , class T1 , class T2 , class T3 >
errno_t Start (const ThreadSettings &settings, const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC , class T1 , class T2 , class T3 >
errno_t Start (const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3)
 引数を3つもつ関数を別スレッドで実行開始します。引数を3つ持つこと以外は、引数が1つのバージョンと同じです。
 
引数4つを受け取る関数や関数オブジェクトを起動するメンバ
template<class FUNC , class T1 , class T2 , class T3 , class T4 >
errno_t Start (const ThreadSettings &settings, const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, move_tag)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC , class T1 , class T2 , class T3 , class T4 >
errno_t Start (const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, move_tag)
 引数を4つもつ関数を別スレッドで実行開始します。 引数を4つ持つこと以外は、引数が1つのバージョンと同じです。
 
template<class FUNC , class T1 , class T2 , class T3 , class T4 >
errno_t Start (const ThreadSettings &settings, const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC , class T1 , class T2 , class T3 , class T4 >
errno_t Start (const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4)
 引数を4つもつ関数を別スレッドで実行開始します。引数を4つ持つこと以外は、引数が1つのバージョンと同じです。
 
引数5つを受け取る関数や関数オブジェクトを起動するメンバ
template<class FUNC , class T1 , class T2 , class T3 , class T4 , class T5 >
errno_t Start (const ThreadSettings &settings, const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, const T5 &arg5, move_tag)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC , class T1 , class T2 , class T3 , class T4 , class T5 >
errno_t Start (const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, const T5 &arg5, move_tag)
 引数を5つもつ関数を別スレッドで実行開始します。引数を5つ持つこと以外は、引数が1つのバージョンと同じです。
 
template<class FUNC , class T1 , class T2 , class T3 , class T4 , class T5 >
errno_t Start (const ThreadSettings &settings, const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, const T5 &arg5)
 スレッドの起動オプションを指定できること以外はそうでないバージョンと同じです。
 
template<class FUNC , class T1 , class T2 , class T3 , class T4 , class T5 >
errno_t Start (const FUNC &f, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, const T5 &arg5)
 引数を5つもつ関数を別スレッドで実行開始します。引数を5つ持つこと以外は、引数が1つのバージョンと同じです。
 

静的公開メンバ関数

static errno_t YieldThread () noexcept
 nlib_yield()を呼び出します。
 
static errno_t Sleep (const TimeSpan &span) noexcept
 span の期間だけスリープします。
 

詳解

スレッドの生成・開始を行うためのクラスです。

Thread.h199 行目に定義があります。

関数詳解

nn::nlib::threading::Thread::ChangePriority ( int32_t  priority)
inlinenoexcept

スレッドの優先度を設定します。

引数
[in]priorityスレッドの優先度
戻り値
0成功した場合
EINVALpriority が0未満であるか31より大きい場合
ESRCHその他のエラーの場合
説明
内部でnlib_thread_setpriority()を呼び出します。

Thread.h232 行目に定義があります。

nn::nlib::threading::Thread::Detach ( )
inlinenoexcept

スレッドをデタッチします。

戻り値
0ならば成功
説明
内部でnlib_thread_detach()を呼び出します。

Thread.h223 行目に定義があります。

nn::nlib::threading::Thread::GetNativeHandle ( ) const
inlinenoexcept

実装依存のスレッド識別子を取得します。

戻り値
実装依存のスレッド識別子
説明
nlib_thread型の値を返します。

Thread.h238 行目に定義があります。

nn::nlib::threading::Thread::GetPriority ( int32_t *  priority)
inlinenoexcept

スレッドの優先度を取得します。

引数
[out]priorityスレッドの優先度が格納されます。
戻り値
0スレッドの優先度が取得できた場合
EINVALpriorityNULLの場合
ESRCHその他のエラーの場合
説明
内部でnlib_thread_getpriority()を呼び出します。

Thread.h229 行目に定義があります。

nn::nlib::threading::Thread::IsJoinable ( ) const
inlinenoexcept

join可能かどうか調べます。

戻り値
join可能ならばtrue
Cafeでの実装
GetNativeHandle()からネイティブコードでjoinしたりdetachした場合、正しい結果を返さなくなります。

Thread.h228 行目に定義があります。

nn::nlib::threading::Thread::Join ( )
inlinenoexcept

スレッドの実行完了を待ちます。

戻り値
0ならば成功
説明
内部でnlib_thread_join()を呼び出します。

Thread.h213 行目に定義があります。

nn::nlib::threading::Thread::SetAffinity ( uint32_t  affinity)
inlinenoexcept

スレッドのプロセッサアフィニティマスクを設定します。

引数
[in]affinityスレッドアフィニティマスク
戻り値
0ならば成功
説明
内部でnlib_thread_setaffinity()を呼び出します。

Thread.h235 行目に定義があります。

template<class FUNC , class T1 >
nn::nlib::threading::Thread::Start ( const FUNC &  f,
const T1 &  arg1,
move_tag   
)
inline

引数を1つもつ関数を別スレッドで実行開始します。

引数
[in]f別スレッドで実行する関数
[in]arg1関数f に与える引数
テンプレート引数
FUNC引数を1つ取る関数や関数オブジェクト
T1関数fに与える引数の型
戻り値
0スレッドが開始した場合
EINVALfuncNULLの場合
ENOMEMシステムリソースが足りない場合
説明
末尾の引数にmove_tag型のオブジェクトを追加することで、f, arg1 がムーブ(メンバのswap関数による実装)されます。
arg1, fconst_castされ、swap()関数により内部で作成される構造体にセットされます。 従って、arg1のコピーコンストラクタは、スレッド内でf を実行する際にのみ起動されます(C++11ではムーブされる)。

Thread.h543 行目に定義があります。

template<class FUNC >
nn::nlib::threading::Thread::Start ( const FUNC &  f)
inline

引数を持たない関数を別スレッドで実行開始します。

引数
[in]f別スレッドで実行する関数
テンプレート引数
FUNC引数を1つ取る関数や関数オブジェクト
戻り値
0スレッドが開始した場合
EINVALfuncNULLの場合
ENOMEMシステムリソースが足りない場合

Thread.h611 行目に定義があります。

template<class FUNC , class T1 >
nn::nlib::threading::Thread::Start ( const FUNC &  f,
const T1 &  arg1 
)
inline

引数を1つもつ関数を別スレッドで実行開始します。

引数
[in]f別スレッドで実行する関数
[in]arg1関数fに与える引数
テンプレート引数
FUNC引数を1つ取る関数や関数オブジェクト
T1関数fに与える引数の型
戻り値
0スレッドが開始した場合
EINVALfuncNULLの場合
ENOMEMシステムリソースが足りない場合
説明
arg1は値渡しされることに注意してください。 arg1のコピーコンストラクタは以下のタイミングで2回呼び出されます。
  • 実行スレッドでの参照用に内部で作成される構造体にセットされる際
  • スレッド内でf の引数として与えられる際(C++11ではムーブされる)

Thread.h622 行目に定義があります。

nn::nlib::threading::Thread::StartRaw ( ThreadFunc  func,
void *  arg 
)
inlinenoexcept

void*型の引数を1つもつ関数を別スレッドで実行開始します。

引数
[in]func実行する関数
[in,out]argfunc への引数
戻り値
0スレッドが開始した場合
EINVALfuncNULLの場合
ENOMEMシステムリソースが足りない場合
説明
(void*型なので)arg の内容がコピーされたりすることはありません。 スレッドを高速に起動することができますが、オブジェクトへのポインタを渡したりする場合は、メモリ領域の所有権や寿命等の扱いに気をつける必要があります。

Thread.h207 行目に定義があります。

nn::nlib::threading::Thread::StartRaw ( ThreadFunc  func,
void *  arg,
const ThreadSettings settings 
)
noexcept

void*型の引数を1つもつ関数を別スレッドで実行開始します。

引数
[in]func実行する関数
[in,out]argfunc への引数
[in]settingsスレッドの起動オプション設定
戻り値
0スレッドが開始した場合
EINVALfuncNULLの場合
ENOMEMシステムリソースが足りない場合
nn::nlib::threading::Thread::StartRaw ( const ThreadSettings settings,
ThreadArg<>::Func  func 
)
inlinenoexcept

引数を持たない関数を別スレッドで実行開始します。

引数
[in]settingsスレッドの起動オプション設定
[in]func実行する関数
戻り値
0スレッドが開始した場合
EINVALfuncNULLの場合
ENOMEMシステムリソースが足りない場合

Thread.h256 行目に定義があります。

nn::nlib::threading::Thread::StartRaw ( ThreadArg<>::Func  func)
inlinenoexcept

引数を持たない関数を別スレッドで実行開始します。

引数
[in]func実行する関数
戻り値
0スレッドが開始した場合
EINVALfuncNULLの場合
ENOMEMシステムリソースが足りない場合

Thread.h260 行目に定義があります。

template<class ThArg >
nn::nlib::threading::Thread::StartRaw ( const ThreadSettings settings,
UniquePtr< ThArg > &  ptr 
)
inlinenoexcept

別スレッドの実行を開始します。

テンプレート引数
ThArgThreadArg クラステンプレートの型
引数
[in]ptrスレッドに渡すオブジェクトへのポインタ
[in]settingsスレッドの起動オプション設定
戻り値
0スレッドが開始した場合
EINVALptrNULLの場合
ENOMEMシステムリソースが足りない場合

Thread.h265 行目に定義があります。

template<class ThArg >
nn::nlib::threading::Thread::StartRaw ( UniquePtr< ThArg > &  ptr)
inlinenoexcept

別スレッドの実行を開始します。

テンプレート引数
ThArgThreadArg1, ThreadArg2, ThreadArg3, ThreadArg4, ThreadArg5のどれか
引数
[in]ptrスレッドに渡すオブジェクトへのポインタ
戻り値
0スレッドが開始した場合
EINVALptrNULLの場合
ENOMEMシステムリソースが足りない場合
説明
以下のような関数を作成して実行させることができます。
void threadFunc1(UniquePtr<ThreadArg<T1> >& ptr) {
// ptr->arg1でアクセス
}
....
Thread th;
ThreadArg<T1>::ArgType ptr(new ThreadArg<T1>(threadFunc1, ...));
errno_t e = th.StartRaw(ptr);
// e == 0の場合はスレッドが起動し、ThreadArg<T1>のメモリ領域の所有権は起動スレッド側に移動する。
この構造体のセットアップと関数の記述は若干煩雑になっていますが、引数として渡されるThreadArg<T1>構造体の領域は親スレッドで作成したものが、所有権の移動がなされて利用されます。 従ってコピーコンストラクタの実行コストが無視できない場合に、スレッドの呼び出しコストを節約することができます。

Thread.h274 行目に定義があります。


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