के साथ std :: async द्वारा लॉन्च किए गए थ्रेड के बारे में भ्रम मैं std::async
फ़ंक्शन के बारे में थोड़ा उलझन में हूं।std :: async std :: async पैरामीटर
विनिर्देश कहता है: एसिंक्रोनस ऑपरेशन निष्पादित किया जा रहा है "जैसे कि निष्पादन के नए धागे में" (सी ++ 11 §30.6.8/11)।
अब, इसका क्या अर्थ है?
मेरी समझ में, कोड
std::future<double> fut = std::async(std::launch::async, pow2, num);
एक नया धागा पर समारोह pow2
लांच और चर num
भविष्य, जब समारोह किया जाता है में कुछ समय मूल्य से धागा करने के लिए गुजरती हैं, तो चाहिए, जगह परिणाम fut
(जब तक कार्य pow2
में double pow2(double);
जैसे हस्ताक्षर हैं)। लेकिन विनिर्देशन "जैसा है" कहता है, जो पूरी चीज को मेरे लिए थोड़ी दूर बनाता है।
सवाल यह है:
हमेशा इस मामले में शुरू की एक नई धागा है? मुझे उम्मीद है। मेरा मतलब है, पैरामीटर std::launch::async
इस तरह से समझ में आता है कि मैं स्पष्ट रूप से बता रहा हूं कि मैं वास्तव में एक नया धागा बनाना चाहता हूं।
और कोड
std::future<double> fut = std::async(std::launch::deferred, pow2, num);
आलसी मूल्यांकन संभव बनाना चाहिए, जहाँ मैं var = fut.get();
की तरह कुछ लिखने के लिए pow2
समारोह कॉल में देरी से। इस मामले में पैरामीटर std::launch::deferred
, इसका मतलब यह होना चाहिए कि मैं स्पष्ट रूप से बता रहा हूं, मुझे कोई नया धागा नहीं चाहिए, मैं बस यह सुनिश्चित करना चाहता हूं कि फ़ंक्शन को इसके वापसी मूल्य की आवश्यकता होने पर कॉल किया जाए।
क्या मेरी धारणाएं सही हैं? यदि नहीं, तो कृपया समझाएं।
इसके अलावा, मुझे पता है कि डिफ़ॉल्ट रूप से समारोह के रूप में निम्नानुसार कहा जाता है:
std::future<double> fut = std::async(std::launch::deferred | std::launch::async, pow2, num);
इस मामले में, मुझे बताया गया था कि एक नया धागा या शुरू किया जाएगा कि क्या नहीं कार्यान्वयन पर निर्भर करता है। दोबारा, इसका क्या अर्थ है?
"के रूप में यदि" इसका मतलब है कि यह सैद्धांतिक रूप से के रूप में एक मौजूदा धागा (जैसे, एक धागा पूल में) का पुन: उपयोग कर सकते हैं जब तक व्यवहार अलग नहीं है। अभ्यास में, बहुत कम (यदि कोई है) कार्यान्वयन ऐसा इसलिए करता है क्योंकि "जैसे कि एक नया धागा" आपको सभी धागे-स्थानीय चर को नष्ट करने और फिर से बनाने की आवश्यकता है। –
@ टी.सी. या लागू (भारी) coroutine- स्थानीय चर। प्रत्येक थ्रेड को डिफ़ॉल्ट कोरआउटिन प्राप्त करें, और 'thread_local' कोरआउट स्थानीय है। 'Async' एक कोरआउटिन बना सकता है, कि कोरआउट को दूसरे थ्रेड में चलाया जा सकता है और चलाया जा सकता है। ओई, ओएस-प्रदत्त थ्रेड मॉडल के शीर्ष पर थ्रेडिंग (कोरआउट के साथ) अनुकरण करें? – Yakk
मैंने ध्यान दिया 'std :: async' टूटा हुआ है, क्या यह सच है? –