मैं std::async
के बारे में और कैसे एक भविष्य संकलक कार्यान्वयन में इसका इस्तेमाल करना चाहिए सोच रहा हूँ। हालांकि, अभी मैं कुछ ऐसी चीज से फंस गया हूं जो डिज़ाइन दोष की तरह महसूस करता है।std :: async - कार्यान्वयन निर्भर उपयोग?
std::async
launch::async
के संभवतः दो प्रकारों के साथ बहुत अधिक कार्यान्वयन निर्भर है, जो एक कार्य को एक नए थ्रेड में लॉन्च करता है और एक थ्रेड-पूल/टास्क-शेड्यूलर का उपयोग करता है।
हालांकि, एक है जो इन वेरिएंट कि std::async
लागू करने के लिए उपयोग किया जाता है में से एक के आधार उपयोग काफी भिन्नता होगी।
"थ्रेड-पूल" आधारित संस्करण के लिए आप ओवरहेड्स के बारे में ज्यादा चिंता किए बिना बहुत से छोटे कार्यों को लॉन्च करने में सक्षम होंगे, हालांकि, अगर किसी एक कार्य में कुछ कार्य अवरुद्ध हो जाए तो क्या होगा?
दूसरी ओर "लॉन्च न्यू थ्रेड" संस्करण को अवरुद्ध कार्यों के साथ समस्याएं नहीं आतीं, दूसरी तरफ, लॉन्च करने और कार्यों को निष्पादित करने का ओवरहेड बहुत अधिक होगा।
धागा पूल: + कम भूमि के ऊपर, -never कभी
लांच नया थ्रेड ब्लॉक: + ब्लॉक के साथ ठीक, ऊंची भूमि के ऊपर
तो मूल रूप से क्रियान्वयन के आधार पर जिस तरह से हम का उपयोग std::async
बहुत ज्यादा सावधान होगा। यदि हमारे पास एक प्रोग्राम है जो एक कंपाइलर के साथ अच्छी तरह से काम करता है, तो यह किसी अन्य पर काम कर सकता है।
इस डिजाइन से है? या क्या मैं कुछ न कुछ भूल रहा हूं? क्या आप इसे एक बड़ी समस्या के रूप में मानेंगे?
वर्तमान विनिर्देश में std::oversubscribe(bool)
जैसे कुछ std::async
पर निर्भरता के कार्यान्वयन को सक्षम करने के लिए मुझे कुछ याद आ रहा है।
संपादित करें: जहां तक मैंने पढ़ा है, सी ++ 11 मानक दस्तावेज़ इस संबंध में कोई संकेत नहीं देता है कि std::async
पर भेजे गए कार्यों को ब्लॉक किया जा सकता है या नहीं।
बस एक अतिरिक्त के रूप में: http://en.cppreference.com/w/cpp/thread/async 'std :: async' कॉल को अवरुद्ध करने का एक सरल और यथार्थवादी उदाहरण प्रदान करता है। – KillianDS
आपको लगता है कि थ्रेड पूल का एक निश्चित आकार है। व्यावहारिक रूप से, कई गतिशील रूप से आकार में होते हैं, इसलिए अवरोधन कोई मुद्दा नहीं है। –
@MooingDuck: न तो टीबीबी और न ही कॉन्सर्ट में "गतिशील रूप से" थ्रेड पूल आकार हैं। आप किस थ्रेड पूल के बारे में जानते हैं जो गतिशील रूप से आकार में हैं? और यहां तक कि यदि आपके पास गतिशील रूप से आकार का थ्रेड पूल है, तो इसके बजाय आपको ओवरसब्सक्रिप्शन की समस्या मिलती है और नए थ्रेड जोड़ने और पुराने लोगों को हटाने का ट्रैक रखने के लिए जो कुछ भी ह्यूरिस्टिक्स की आवश्यकता होती है, उसके ऊपर की ओर बढ़ जाती है। – ronag