2012-04-14 10 views
10

私は構造体のベクトルを反復処理し、各構造体を個別に処理しています。
それはこのようなものになります。DoTaskが特定のWebサイトに接続し、HTMLを解析しているためforループ/ for_eachの各繰り返しを並列に行うことはできますか? (C++ 11)

for_each(begin(data),end(data),DoTask); 
//assume "data" is std::vector<DataT> 
//assume DoTask is a function that takes a DataT by reference 

コードはかなり遅いです。
これをスピードアップするにはどうすればよいでしょうか?
私の目標は、複数のDataTを同時に分析することです。
私はスレッディングにはとても新しいですが、std::asyncstd::futureが有望です。

答えて

9

あなたはこの

for(T& d : data) std::thread(DoTask, d).detach(); 

それとも、Intelのスレッドビルディングブロックのような、より複雑なものを使用してparallel_forできる(という名前ではないのですか?)その機能のような何かを行うことができます。

+2

-1この例では、 'std :: async'から作成された' std :: future'のデストラクタがブロックされるため、完全に同期しています。これには、作業のスケーリングなどもありません。 – inf

+1

@bamboonあなたが正しいです、私は 'future's、良い点のデストラクタにもかかわらず。私がこの答えを書いたとき、スレッドライブラリの私の理解は未来を包含しませんでした。私はそれが正しいと改訂した、と私は思う。そしてOPはワークステリングを必要としませんでした。 –

3

Windows/VS2010(またはそれ以降)をターゲットにしている場合は、いつでもMicrosoftからThe Parallel Patterns Library (PPL)を使用できます。それはparallel_for_each

parallel_for_each(values.begin(), values.end(), [] (int& value) 
{ 
    value *= 2; 
}); 
6

あなたはGCCを使用していますか?最近のバージョンのパラレルバージョンはfor_eachです(使用方法はhereを参照)。

関連する問題