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

予めプールされた作成済みのスレッドに対してタスクを投入することができます。 [詳解]

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

公開メンバ関数

 ThreadPool () noexcept
 デフォルトコンストラクタです。Init()で初期化する必要があります。
 
errno_t Init (size_t thread_count, const ThreadSettings &settings) noexcept
 スレッドを起動してスレッドプールを初期化します。 [詳解]
 
errno_t Init (size_t thread_count) noexcept
 スレッドを起動してスレッドプールを初期化します。 [詳解]
 
errno_t Init () noexcept
 スレッドを起動してスレッドプールを初期化します。 [詳解]
 
 ~ThreadPool () noexcept
 デストラクタです。内部で起動したスレッドを全てJoinします。
 
template<class R , class FUNC >
errno_t Submit (Future< R > *future, FUNC &func) noexcept
 スレッドプールにタスクを投入します。 [詳解]
 
size_t Count () noexcept
 スレッドプールが保持するスレッドの数を返します。
 

詳解

予めプールされた作成済みのスレッドに対してタスクを投入することができます。

説明
タスク毎に新たにスレッドを作成し、実行後に破棄するという自明な方法の問題点は、新たにスレッドを作成し、破棄することによるオーバーヘッドが大きいことです。 また、同時に存在するスレッド数が多すぎる場合、メモリの過剰消費によりメモリが不足したりスラッシングが発生したりという問題が発生します。
スレッドプールを利用すると、スレッドの作成と破棄に関するオーバーヘッドの問題と、同時に実行するスレッド数が多すぎる問題に対処することができます。
ThreadPoolクラスは、タスク投入時にFutureを返すことで各タスクが完了したかどうかの確認とその戻り値を取得することが可能になっています。

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

関数詳解

§ Init() [1/3]

nn::nlib::threading::ThreadPool::Init ( size_t  thread_count,
const ThreadSettings settings 
)
noexcept

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

引数
[in]thread_count起動するスレッドの数
[in]settings起動するスレッドの設定
戻り値
0ならば成功

§ Init() [2/3]

nn::nlib::threading::ThreadPool::Init ( size_t  thread_count)
inlinenoexcept

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

引数
[in]thread_count起動するスレッドの数
戻り値
0ならば成功

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

§ Init() [3/3]

nn::nlib::threading::ThreadPool::Init ( )
inlinenoexcept

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

戻り値
0ならば成功
説明
内部でGetHardwareConcurrency()を実行してその数だけスレッドを起動します。

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

§ Submit()

template<class R , class FUNC >
errno_t nn::nlib::threading::ThreadPool::Submit ( Future< R > *  future,
FUNC &  func 
)
inlinenoexcept

スレッドプールにタスクを投入します。

テンプレート引数
RFUNCの戻り値の型です。
FUNC引数を取らず、型Rを返す関数ポインタ等の呼び出し可能なオブジェクトの型です。
引数
[out]future投入するタスク(func)に対するフューチャーが格納されるポインタです。
[in]func投入するタスク
戻り値
0ならば成功
説明
実行効率のため、func は内部でswapによって受け渡しされることがあります。 そのため、関数オブジェクト等を渡した場合にfunc の内容は保証されません。

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


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