予めプールされた作成済みのスレッドに対してタスクを投入することができます。
[詳解]
#include "nn/nlib/threading/ThreadPool.h"
予めプールされた作成済みのスレッドに対してタスクを投入することができます。
- 説明
- タスク毎に新たにスレッドを作成し、実行後に破棄するという自明な方法の問題点は、新たにスレッドを作成し、破棄することによるオーバーヘッドが大きいことです。 また、同時に存在するスレッド数が多すぎる場合、メモリの過剰消費によりメモリが不足したりスラッシングが発生したりという問題が発生します。
- スレッドプールを利用すると、スレッドの作成と破棄に関するオーバーヘッドの問題と、同時に実行するスレッド数が多すぎる問題に対処することができます。
ThreadPool
クラスは、タスク投入時にFuture
を返すことで各タスクが完了したかどうかの確認とその戻り値を取得することが可能になっています。
ThreadPool.h の 51 行目に定義があります。
◆ 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.h の 55 行目に定義があります。
◆ Init() [3/3]
nn::nlib::threading::ThreadPool::Init |
( |
| ) |
|
|
inlinenoexcept |
◆ Submit()
template<class R , class FUNC >
errno_t nn::nlib::threading::ThreadPool::Submit |
( |
Future< R > * |
future, |
|
|
FUNC & |
func |
|
) |
| |
|
inlinenoexcept |
スレッドプールにタスクを投入します。
- テンプレート引数
-
R | FUNC の戻り値の型です。 |
FUNC | 引数を取らず、型R を返す関数ポインタ等の呼び出し可能なオブジェクトの型です。 |
- 引数
-
[out] | future | 投入するタスク(func )に対するフューチャーが格納されるポインタです。 |
[in] | func | 投入するタスク |
- 戻り値
- 0ならば成功
- 説明
- 実行効率のため、
func
は内部でswap
によって受け渡しされることがあります。 そのため、関数オブジェクト等を渡した場合にfunc
の内容は保証されません。
ThreadPool.h の 77 行目に定義があります。
このクラス詳解は次のファイルから抽出されました: