2012-04-14 13 views
10

मैं structs के वेक्टर पर पुनरावृत्ति कर रहा हूं और प्रत्येक संरचना को व्यक्तिगत रूप से संसाधित कर रहा हूं।लूप/for_each के लिए प्रत्येक इटरेशन समानांतर में किया जा सकता है? (सी ++ 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 विशेष वेबसाइटों को जोड़ता है और एचटीएमएल का विश्लेषण करती है है:
वह कुछ इस तरह लग रहा है।
इसे गति देने का सबसे अच्छा तरीका क्या होगा?
मेरा लक्ष्य एक साथ कई डेटाटी का विश्लेषण करना है।
मैं थ्रेडिंग के लिए बहुत नया हूं, लेकिन std::async और std::future आशाजनक लग रहा है।

उत्तर

9

आप इस

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

की तरह कुछ कर सकते हैं या आप कुछ और इंटेल की थ्रेड बिल्डिंग ब्लॉक्स और parallel_for जैसे जटिल उपयोग कर सकते हैं उसके समारोह (कि नाम नहीं है?)।

+2

-1 उदाहरण पूरी तरह से तुल्यकालिक होगा क्योंकि 'std :: async' से बनाए गए 'std :: भविष्य' के विनाशक के रूप में यह कोई वर्कस्टाइलिंग आदि प्रदान नहीं करेगा। वास्तव में समवर्ती पुस्तकालय के साथ जाना चाहिए। – inf

+1

@ बांसबोन आप सही हैं, मैं 'भविष्य के, अच्छे बिंदु के विनाशकों के बावजूद नहीं था। जब मैंने यह उत्तर लिखा था तो थ्रेडिंग लाइब्रेरी की मेरी समझ में वायदा शामिल नहीं था। मैंने इसे सही करने के लिए संशोधित किया है, मुझे लगता है। और ओपी को वर्कस्टाइलिंग की आवश्यकता नहीं थी। –

3

यदि आप Windows/VS2010 (या बाद में) को लक्षित करते हैं, तो आप हमेशा माइक्रोसॉफ्ट से The Parallel Patterns Library (PPL) का उपयोग कर सकते हैं। इसमें parallel_for_each:

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

क्या आप जीसीसी का उपयोग कर रहे हैं? हाल के संस्करणों में for_each का समांतर संस्करण है (इसे देखने के लिए here देखें)।

संबंधित मुद्दे

 संबंधित मुद्दे