C++ で Worker Thread パターン

Worker Thread とは一般に生成、破棄コストの高いスレッドをプールして使い回すためのパターンで Thread Pool とも呼ばれます。 Worker Thread パターンは Producer-Consumter パターンに基づいており、キューで受け渡されるのがデータではなく実行可能な仕事を表現したオブジェクトである点が特徴です。

以下の例で Runnable は仕事の基底クラスであり、std::shared_ptr<Runnable> のキューをを介してプールされているスレッドに仕事を依頼します。 クライアントは Runnable のサブクラスを作成し、インスタンスをスレッドプールに add する事で自分でスレッドをハンドルする事無く非同期に仕事を実行させる事ができます。

実際に使用してみると以下のようになります。 以下の例では WorkA, WorkB という異なる2つの内容の Runnable サブクラスのインスタンスを add しています。 仕事は Runnable で抽象化されていますので WorkA、 WorkB 以外にも任意の仕事を実行させる事が可能です。

Runnable のような基底クラスではなく特定の仕事クラスのキューを持たせる事も可能ですが、より汎用的にするためにこのようにするケースが多いように思います。また C++11 からは std::function が利用できますので、std::function のキューにするとより C++ っぽいかもしれません。

std::function 版の使用例です。

C++ でマルチスレッドデザインパターン

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中