यह इस सवाल से संबंधित है: क्या std :: C ++ 11 में पिरोया हुआ धागा है? । हालांकि यह सवाल अलग है, इरादा एक ही है:
प्रश्न 1: क्या यह अभी भी महंगा धागा निर्माण से बचने के लिए अपने (या 3-पार्टी लाइब्रेरी) थ्रेड पूल का उपयोग करने के लिए समझ में आता है?
अन्य प्रश्न में निष्कर्ष यह था कि आप std::thread
पूल किए जाने पर भरोसा नहीं कर सकते (यह हो सकता है या नहीं भी हो सकता है)। हालांकि, std::async(launch::async)
लगता है कि पूल किए जाने की अधिक संभावना है।
यह नहीं लगता कि यह मानक द्वारा मजबूर किया गया है, लेकिन IMHO मुझे उम्मीद है कि सभी अच्छे C ++ 11 कार्यान्वयन थ्रेड पूलिंग का उपयोग करेंगे यदि थ्रेड निर्माण धीमा है। केवल उन प्लेटफार्मों पर जहां एक नया धागा बनाना सस्ता है, मैं उम्मीद करूंगा कि वे हमेशा एक नया धागा रखें।
प्रश्न 2: यह वही है जो मुझे लगता है, लेकिन मेरे पास इसे साबित करने के लिए कोई तथ्य नहीं है। मुझसे बहुत गलत हो सकता है। क्या यह एक शिक्षित अनुमान है?
अंत में, यहाँ मैंने कुछ सैंपल कोड दिए हैं जो पहले दिखाता है कि मुझे लगता है कि थ्रेड क्रिएशन को कैसे व्यक्त किया जा सकता है async(launch::async)
:
उदाहरण 1:
thread t([]{ f(); });
// ...
t.join();
हो जाता है
auto future = async(launch::async, []{ f(); });
// ...
future.wait();
उदाहरण 2: आग और धागा भूल जाओ
thread([]{ f(); }).detach();
हो जाता है
// a bit clumsy...
auto dummy = async(launch::async, []{ f(); });
// ... but I hope soon it can be simplified to
async(launch::async, []{ f(); });
प्रश्न 3: क्या आप async
संस्करणों को संस्करण पसंद करेंगे thread
?
बाकी अब सवाल का हिस्सा नहीं है, लेकिन केवल स्पष्टीकरण के लिए:
रिटर्न मान को डमी वेरिएबल को क्यों सौंपा जाना चाहिए?
दुर्भाग्य से, वर्तमान C ++ 11 मानक बल जो आप के रिटर्न मान पर कब्जा करते हैं std::async
, अन्यथा अन्यथा विध्वंसक को निष्पादित किया जाता है, जो कार्रवाई समाप्त होने तक ब्लॉक करता है। इसे मानक में कुछ त्रुटि माना जाता है (जैसे, हर्ब सटर द्वारा)।
से यह उदाहरण cppreference.com यह अच्छी तरह दिखाता है:
{
std::async(std::launch::async, []{ f(); });
std::async(std::launch::async, []{ g(); }); // does not run until f() completes
}
एक और स्पष्टीकरण:
मुझे पता है कि थ्रेड पूल के अन्य वैध उपयोग हो सकते हैं लेकिन इस प्रश्न में मैं केवल महंगी धागा निर्माण लागत से बचने के पहलू में दिलचस्पी रखता हूं ।
मुझे लगता है कि अभी भी ऐसी परिस्थितियां हैं जहां थ्रेड पूल बहुत उपयोगी हैं, खासकर यदि आपको संसाधनों पर अधिक नियंत्रण की आवश्यकता है। उदाहरण के लिए, एक सर्वर तेजी से प्रतिक्रिया समय की गारंटी देने और स्मृति उपयोग की भविष्यवाणी को बढ़ाने के लिए केवल एक निश्चित संख्या में अनुरोधों को संभालने का निर्णय ले सकता है। थ्रेड पूल ठीक होना चाहिए, यहां।
थ्रेड-लोकल वैरिएबल आपके थ्रेड पूल के लिए भी एक तर्क हो सकता है, लेकिन मुझे यकीन नहीं है कि यह अभ्यास में प्रासंगिक है:
- के साथ एक नया सूत्र बनाना
std::thread
आरंभिक थ्रेड-लोकल वेरिएबल्स के बिना शुरू होता है। शायद यह वह नहीं है जो आप चाहते हैं। - द्वारा पिरोए गए धागों में
async
, यह मेरे लिए कुछ अस्पष्ट है क्योंकि धागे का पुन: उपयोग किया जा सकता था। मेरी समझ से, थ्रेड-लोकल वैरिएबल को रीसेट करने की गारंटी नहीं है, लेकिन मुझसे गलती हो सकती है। - दूसरी ओर, अपने स्वयं के (निश्चित-आकार) थ्रेड पूल का उपयोग करना, यदि आपको वास्तव में इसकी आवश्यकता है तो आपको पूर्ण नियंत्रण प्रदान करता है।
std::async()
। मैं अभी भी यह देखने के लिए उत्सुक हूं कि वे थ्रेड पूल में गैर-तुच्छ थ्रेड_लोक डिस्ट्रक्टर्स का समर्थन कैसे करते हैं।
launch::async
तो यह ऐसा व्यवहार करता है जैसे कि यह केवल launch::deferred
और कभी इसे अतुल्यकालिक रूप से निष्पादित नहीं करता है - इसलिए वास्तव में, libstdc ++ का वह संस्करण "चुनता है" जब तक अन्यथा अन्यथा मजबूर न हो, तब तक हमेशा स्थगित का उपयोग करें।
std::async
प्रदर्शन के लिए एक सुंदर चीज हो सकती है - यह मानक शॉर्ट-रनिंग-टास्क निष्पादन प्रणाली हो सकती है, स्वाभाविक रूप से थ्रेड पूल द्वारा समर्थित है। अभी, यह सिर्फ std::thread
कुछ बकवास के साथ है, जिससे थ्रेड फ़ंक्शन एक मान वापस करने में सक्षम हो। ओह, और उन्होंने निरर्थक "आस्थगित" कार्यक्षमता जोड़ी जो std::function
पूरी तरह से नौकरी को ओवरलैप करती है ।
std::async(launch::async)
लगता है कि पूल किए जाने की बहुत अधिक संभावना है।" नहीं, मेरा मानना है कि इसकाstd::async(launch::async | launch::deferred)
तालमेल हो सकता है। केवलlaunch::async
इस कार्य को नए धागे पर लॉन्च किया जाना चाहिए, भले ही अन्य कार्य चल रहे हों। नीति के साथlaunch::async | launch::deferred
फिर कार्यान्वयन किस नीति को चुनने के लिए हो जाता है, लेकिन अधिक महत्वपूर्ण बात यह है कि किस नीति को चुनने में देरी होती है। यही है, यह तब तक इंतजार कर सकता है जब तक एक थ्रेड पूल में एक धागा उपलब्ध नहीं हो जाता है और फिर एस्किंस पॉलिसी का चयन करें।