C++ で Guarded Suspention パターン

Guarded Suspention とは、ある条件が整うまでスレッドの実行を block するというパターンです。 C++ の標準ライブラリで condition variable が提供されていますので、そのまま Guarded Suspention パターンに利用することができます。

以下の例はキューに追加された文字列をスレッドで取り出して標準出力に出力する例です。 Printer というクラスが内部にスレッドを有しており、append で文字列が追加された際にスレッドを起床させて処理をさせます。スレッド側はキューが空になるとブロックされて sleep 状態に入ります。

実際に使用すると以下の用になります。

実装的な注意点として C++ ではメンバー変数の初期化は初期化リストの記述順ではなく宣言順に行われるため、上記の例では std::thread のメンバーの宣言は最後に行うようにする必要があります。スレッドの動作は初期化リストでコンストラクトされた直後に開始されるため、うっかりスレッドが触っているメンバー変数の宣言をスレッドインスタンス宣言の後に行ってしまうとタイミングによって未初期化変数へのアクセスが発生してしまいます。

ちなみに上記の例ではスレッドをお行儀良く終了させるために  Two-Phase Termination パターン を併用しています。

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中