nlib
nn::nlib::threading::LockFreeThreadPool< N > クラステンプレートfinal

細粒度のタスクを投入するのに向いたスレッドプールです。 [詳解]

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

nn::nlib::threading::detail::LockFreeThreadPoolBaseを継承しています。

公開型

typedef void *(* Func) (void **args, size_t n)
 スレッドプールに投入できる関数の型です。 [詳解]
 
typedef void(* Callback) (void *result)
 タスク終了時に呼び出されるコールバック関数の型です。 [詳解]
 

公開メンバ関数

 LockFreeThreadPool () noexcept
 デフォルトコンストラクタです。Init()で初期化する必要があります。
 
 ~LockFreeThreadPool () noexcept
 デストラクタです。内部で起動したスレッドを全てJoinします。
 
errno_t Init (size_t work_queue_size, size_t thread_count, const ThreadSettings &settings) noexcept
 スレッドを起動してスレッドプールを初期化します。 [詳解]
 
errno_t SubmitVarArgs (Func func, Callback callback, size_t n,...) noexcept
 スレッドプールに関数の引数の数を指定してタスクを投入します。 [詳解]
 
errno_t Submit (Func func, Callback callback)
 関数への引数を指定せず、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
errno_t Submit (Func func, Callback callback, void *arg0)
 関数への引数を1個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
errno_t Submit (Func func, Callback callback, void *arg0, void *arg1)
 関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
errno_t Submit (Func func, Callback callback, void *arg0, void *arg1, void *arg2)
 関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
errno_t Submit (Func func, Callback callback, void *arg0, void *arg1, void *arg2, void *arg3)
 関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
errno_t Submit (Func func, Callback callback, void *arg0, void *arg1, void *arg2, void *arg3, void *arg4)
 関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
errno_t Submit (Func func, Callback callback, void *arg0, void *arg1, void *arg2, void *arg3, void *arg4, void *arg5)
 関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
errno_t Submit (Func func, Callback callback, void *arg0, void *arg1, void *arg2, void *arg3, void *arg4, void *arg5, void *arg6)
 関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
errno_t Submit (Func func, Callback callback, void *arg0, void *arg1, void *arg2, void *arg3, void *arg4, void *arg5, void *arg6, void *arg7)
 関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
errno_t Submit (Func func, Callback callback, void *arg0, void *arg1, void *arg2, void *arg3, void *arg4, void *arg5, void *arg6, void *arg7, void *arg8)
 関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
errno_t Submit (Func func, Callback callback, void *arg0, void *arg1, void *arg2, void *arg3, void *arg4, void *arg5, void *arg6, void *arg7, void *arg8, void *arg9)
 関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。 [詳解]
 
size_t GetThreadCount ()
 スレッドプールが保有するスレッドの数を返します。
 

詳解

template<size_t N = 5>
class nn::nlib::threading::LockFreeThreadPool< N >

細粒度のタスクを投入するのに向いたスレッドプールです。

テンプレート引数
Nスレッドプールに投入する関数が受け取れる引数の最大数
説明
スレッドプールのスレッドにタスクを供給するためのキューにロックフリーキューを使い、タスクの投入時や消費時に必要とされていたロックによるオーバーヘッドをなくしています。 更に、1つの関数型のみを投入タスクにできるようにすることで、type erasureに伴う動的メモリ確保や仮想関数呼び出しといったオーバーヘッドを削減しています。 ただし、スレッドプールのスレッドは処理すべきタスクが存在しない場合にはnlib_sleep()又はnlib_yield()によって待つので、アイドル時のオーバーヘッドは上昇します。

ThreadPool.h127 行目に定義があります。

型定義メンバ詳解

◆ Callback

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Callback

タスク終了時に呼び出されるコールバック関数の型です。

引数
[in]resultFuncの戻り値

ThreadPool.h131 行目に定義があります。

◆ Func

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Func

スレッドプールに投入できる関数の型です。

引数
[in]argsvoid*型ポインタの列へのポインタ
[in]nargsに格納されているvoid*型ポインタの数
説明
nはスレッドプールのテンプレート引数Nに一致することに注意してください。

ThreadPool.h130 行目に定義があります。

関数詳解

◆ Init()

template<size_t N>
errno_t nn::nlib::threading::LockFreeThreadPool< N >::Init ( size_t  work_queue_size,
size_t  thread_count,
const ThreadSettings settings 
)
noexcept

スレッドを起動してスレッドプールを初期化します。

引数
[in]work_queue_size投入されたタスクが格納されるキューのサイズ
[in]thread_count起動するスレッドの数
[in]settings起動するスレッドの設定
戻り値
0成功した場合
EINVALthread_countが0又は65535より大きい場合
ENOMEMメモリの確保に失敗した場合
EALREADY既に初期化済みの場合
その他スレッドの作成に失敗した場合

ThreadPool.h357 行目に定義があります。

◆ Submit() [1/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback 
)

関数への引数を指定せず、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ Submit() [2/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback,
void *  arg0 
)

関数への引数を1個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]arg0スレッドプールで実行される関数への引数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ Submit() [3/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback,
void *  arg0,
void *  arg1 
)

関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]arg0スレッドプールで実行される関数への引数
[in]arg1スレッドプールで実行される関数への引数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ Submit() [4/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback,
void *  arg0,
void *  arg1,
void *  arg2 
)

関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]arg0スレッドプールで実行される関数への引数
[in]arg1スレッドプールで実行される関数への引数
[in]arg2スレッドプールで実行される関数への引数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ Submit() [5/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback,
void *  arg0,
void *  arg1,
void *  arg2,
void *  arg3 
)

関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]arg0スレッドプールで実行される関数への引数
[in]arg1スレッドプールで実行される関数への引数
[in]arg2スレッドプールで実行される関数への引数
[in]arg3スレッドプールで実行される関数への引数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ Submit() [6/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback,
void *  arg0,
void *  arg1,
void *  arg2,
void *  arg3,
void *  arg4 
)

関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]arg0スレッドプールで実行される関数への引数
[in]arg1スレッドプールで実行される関数への引数
[in]arg2スレッドプールで実行される関数への引数
[in]arg3スレッドプールで実行される関数への引数
[in]arg4スレッドプールで実行される関数への引数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ Submit() [7/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback,
void *  arg0,
void *  arg1,
void *  arg2,
void *  arg3,
void *  arg4,
void *  arg5 
)

関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]arg0スレッドプールで実行される関数への引数
[in]arg1スレッドプールで実行される関数への引数
[in]arg2スレッドプールで実行される関数への引数
[in]arg3スレッドプールで実行される関数への引数
[in]arg4スレッドプールで実行される関数への引数
[in]arg5スレッドプールで実行される関数への引数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ Submit() [8/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback,
void *  arg0,
void *  arg1,
void *  arg2,
void *  arg3,
void *  arg4,
void *  arg5,
void *  arg6 
)

関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]arg0スレッドプールで実行される関数への引数
[in]arg1スレッドプールで実行される関数への引数
[in]arg2スレッドプールで実行される関数への引数
[in]arg3スレッドプールで実行される関数への引数
[in]arg4スレッドプールで実行される関数への引数
[in]arg5スレッドプールで実行される関数への引数
[in]arg6スレッドプールで実行される関数への引数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ Submit() [9/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback,
void *  arg0,
void *  arg1,
void *  arg2,
void *  arg3,
void *  arg4,
void *  arg5,
void *  arg6,
void *  arg7 
)

関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]arg0スレッドプールで実行される関数への引数
[in]arg1スレッドプールで実行される関数への引数
[in]arg2スレッドプールで実行される関数への引数
[in]arg3スレッドプールで実行される関数への引数
[in]arg4スレッドプールで実行される関数への引数
[in]arg5スレッドプールで実行される関数への引数
[in]arg6スレッドプールで実行される関数への引数
[in]arg7スレッドプールで実行される関数への引数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ Submit() [10/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback,
void *  arg0,
void *  arg1,
void *  arg2,
void *  arg3,
void *  arg4,
void *  arg5,
void *  arg6,
void *  arg7,
void *  arg8 
)

関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]arg0スレッドプールで実行される関数への引数
[in]arg1スレッドプールで実行される関数への引数
[in]arg2スレッドプールで実行される関数への引数
[in]arg3スレッドプールで実行される関数への引数
[in]arg4スレッドプールで実行される関数への引数
[in]arg5スレッドプールで実行される関数への引数
[in]arg6スレッドプールで実行される関数への引数
[in]arg7スレッドプールで実行される関数への引数
[in]arg8スレッドプールで実行される関数への引数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ Submit() [11/11]

template<size_t N = 5>
nn::nlib::threading::LockFreeThreadPool< N >::Submit ( Func  func,
Callback  callback,
void *  arg0,
void *  arg1,
void *  arg2,
void *  arg3,
void *  arg4,
void *  arg5,
void *  arg6,
void *  arg7,
void *  arg8,
void *  arg9 
)

関数への引数を2個指定して、スレッドプールにタスクを投入します。詳細はSubmitVarArgs()を参照してください。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]arg0スレッドプールで実行される関数への引数
[in]arg1スレッドプールで実行される関数への引数
[in]arg2スレッドプールで実行される関数への引数
[in]arg3スレッドプールで実行される関数への引数
[in]arg4スレッドプールで実行される関数への引数
[in]arg5スレッドプールで実行される関数への引数
[in]arg6スレッドプールで実行される関数への引数
[in]arg7スレッドプールで実行される関数への引数
[in]arg8スレッドプールで実行される関数への引数
[in]arg9スレッドプールで実行される関数への引数
戻り値
0成功した場合
EAGAINキューが一杯だった場合

◆ SubmitVarArgs()

template<size_t N>
errno_t nn::nlib::threading::LockFreeThreadPool< N >::SubmitVarArgs ( Func  func,
Callback  callback,
size_t  n,
  ... 
)
noexcept

スレッドプールに関数の引数の数を指定してタスクを投入します。

引数
[in]funcスレッドプールで実行される関数
[in]callbackfuncの戻り値を引数にとるコールバック関数
[in]n後に続くfuncに渡される引数の数
戻り値
0成功した場合
EINVALnが大きすぎる場合
EAGAINキューが一杯だった場合
説明
任意の数の引数を設定してタスクを投入することができます。 引数の数が決まっていて10個以下の場合は、Submit()関数を利用する方が高速です。
funccallbackNULLを設定することが可能です。 funcのみがNULL設定された場合は、NULLがコールバック関数に渡されます。

ThreadPool.h371 行目に定義があります。


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