2012-03-16 22 views
17

साथ async मैं std::launch::async नीति & std::future वस्तु async से लौटे साथ std::async समारोह के व्यवहार के बारे में कुछ सवाल है।एसटीडी के व्यवहार :: std :: लांच :: async नीति

निम्नलिखित कोड में, मुख्य थ्रेड foo() के async कॉल द्वारा बनाए गए धागे पर पूरा होने की प्रतीक्षा करता है।

#include <thread> 
#include <future> 
#include <iostream> 

void foo() 
{ 
    std::cout << "foo:begin" << std::endl; 
    std::this_thread::sleep_for(std::chrono::seconds(10)); 
    std::cout << "foo:done" << std::endl; 
} 

int main() 
{ 
    std::cout << "main:begin" << std::endl; 
    { 
    auto f = std::async(std::launch::async, foo); 
    // dtor f::~f blocks until completion of foo()... why?? 
    } 
    std::this_thread::sleep_for(std::chrono::seconds(2)); 
    std::cout << "main:done" << std::endl; 
} 

और मुझे पता है http://www.stdthread.co.uk/doc/headers/future/async.html कहते

लौटे एसटीडी की अतुल्यकालिक राज्य से संबद्ध अंतिम भविष्य वस्तु का नाशक :: जब तक भविष्य के लिए तैयार है भविष्य को ब्लॉक करेगा।

मेरा प्रश्न है:

  • Q1। क्या यह व्यवहार मौजूदा सी ++ मानक के अनुरूप है?
  • प्रश्न 2। यदि क्यू 1 का जवाब हाँ है, तो कौन से बयान कहते हैं?
+0

क्या इतना अद्भुत मानक के बारे में है कि अक्सर एक फुटनोट पूरी तरह से एक अध्याय को बदल देता है है ... – orlp

उत्तर

16

हाँ, यह सी ++ मानक के लिए आवश्यक है। 30.6.8 [futures.async] अनुच्छेद 5, अंतिम गोली:

- जुड़े धागा पूरा होने के साथ (1.10) पहले समारोह है कि सफलतापूर्वक साझा राज्य के या वापसी के साथ तैयार स्थिति का पता लगाता है से वापसी सिंक्रनाइज़ करता है अंतिम कार्य से जो साझा राज्य जारी करता है, जो भी पहले होता है।

एक और केवल std:future का विनाशक उस स्थिति को पूरा करता है, और इसलिए थ्रेड के पूरा होने की प्रतीक्षा करनी है।

+1

ओपी के कोड VS2012 के लिए ही काम नहीं करता है। यह 'भविष्य के विनाशक' पर अवरुद्ध नहीं है। क्या यह किसी प्रकार की बग है, या माइक्रोसॉफ्ट ने बस सुटर के प्रस्ताव को स्वीकार किया है कि वह डाटर में अवरुद्ध न हो? –

+0

माइक्रोसॉफ्ट ने विनाशकों में अवरुद्ध न करने के लिए हर्ब सटर के प्रस्ताव को लागू करना चुना। –

+0

यह व्यवहार एक बड़ी समस्या है, लेकिन मुझे डर है कि मानक को ठीक करने के लिए अब बहुत देर हो चुकी है। माइक्रोसॉफ्ट गैर मानक व्यवहार को लागू करने का प्रयास कर रहा है क्योंकि वे इसके साथ सहमत नहीं हैं बस क्रॉस प्लेटफार्म डेवलपर्स के लिए जीवन कठिन बनाते हैं। – cdmh

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