parallel_while テンプレート・クラス

概要

作業項目を処理するテンプレート・クラス。

ヒント

これは古いクラス (非推奨) です。代わりに parallel_do () を使用してください。

構文

template<typename Body>
 class parallel_while;

ヘッダー

#include "tbb/parallel_while.h"

説明

parallel_while<Body> は、項目の並列反復を行います。各項目で行う処理は、Body 型の関数オブジェクトによって定義されます。項目は 2 つの方法で指定されます。

次の表は、ストリームとボディーの要件を示しています。

ストリーム S とボディー B の parallel_while の要件

擬似署名

意味

bool S::pop_if_present( B::argument_type& item )

次のストリーム項目を取得します。parallel_while は、同じ this のメソッドを同時に呼び出しません。

B::operator()( B::argument_type& item ) const

item を処理します。 parallel_while は、同じ thisitem が異なる operator を同時に呼び出します。

B::argument_type()

デフォルト・コンストラクター。

B::argument_type( const B::argument_type& )

コピー・コンストラクター。

~B::argument_type()

デストラクター。

例えば、C++ 標準化仕様書のセクション 20.3 で定義されている単項関数オブジェクトは、B の要件をモデル化します。concurrent_queue () は、S の要件をモデル化します。

ヒント

速度を向上するには、B::operator() の粒度は少なくともほぼ 10,000 である必要があります。粒度が小さい場合、parallel_while の内部オーバーヘッドが大きくなります。すべての項目が入力ストリームから読み込まれる場合、parallel_while の並列処理はスケーラブルではありません。スケーリングを達成するには、add メソッドが作業の断片を 2 つ以上追加するようにアルゴリズムを設計してください。

メンバー

namespace tbb {
 template<typename Body>
 class parallel_while {
 public:
 parallel_while();
 ~parallel_while();
 typedef typename Body::argument_type value_type;
 template<typename Stream>
 void run( Stream& stream, const Body& body );
 void add( const value_type& item );
 };
 }
次の表は、このテンプレート・クラスのメンバーの詳細な情報を提供します。
メンバー 説明
parallel_while<Body>()

まだ実行していない parallel_while を構築します。

~parallel_while<Body>()

parallel_while を破棄します。

Template <typename Stream> void run( Stream& stream, const Body& body )

bodystream の各項目と add メソッドによって追加されたほかの項目に適用します。次の条件が両方とも真の場合に終了します。

  • stream.pop_if_present が false を返した。

  • body(x) がストリームまたは add メソッドで生成されたすべての項目 x から戻った。

void add( const value_type& item )

要件: parallel_while によって作成された body .operator() への呼び出しから呼び出されること。その他の場合、run メソッドの終了セマンティクスは未定義です。

効果: 処理する項目のコレクションに項目を追加します。