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 は、同じストリーム・オブジェクトのメソッドを同時に呼び出しません。

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

item を処理します。parallel_while は、同じ ボディー・オブジェクトで item が異なる operator を同時に呼び出します。

B::argument_type()

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

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

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

~B::argument_type()

デストラクター。

ヒント

速度を向上するには、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 メソッドの終了セマンティクスは未定義です。

効果: 処理するアイテムのコレクションにアイテムを追加します。