2012-04-14 64 views
10

我正在遍歷結構向量並單獨處理每個結構。
它看起來是這樣的:循環/ 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 

的代碼是顯著慢,因爲DoTask連接到特定的網站和HTML分析。
加快速度的最佳方法是什麼?
我的目標是同時分析多個DataT。
我很新線程,但std::asyncstd::future看起來很有前途。

回答

9

你可以做這樣的事情

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

或者你可以使用更復雜的東西像英特爾線程構建模塊和parallel_for(是不是叫什麼名字?)功能上。

+2

-1該示例將完全同步,因爲從std :: async'創建的'std :: future'的析構函數將會阻塞,此外這不會提供工作量等。關於應該真正與併發庫一起使用。 – inf 2013-01-20 12:18:38

+1

@bamboon你說得對,我沒有想到'未來'的破壞者,好點。當我寫這個答案時,我對線程庫的理解並不包含未來。我想,我已經修正它是正確的。而且OP不需要工程測試。 – 2013-01-20 16:05:10

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瞭解如何使用它)。

相關問題