2014-09-10 8 views
15

पैकेज किए गए कार्यों का उपयोग करते समय मुझे कुछ अजीब लग रहा है। ~packaged_task पढ़ने पर मुझे लगता है कि अगर std::packaged_task इसे निष्पादित करने से पहले नष्ट कर दिया गया है, तो वादा तोड़ दिया जाएगा और भविष्य से परिणाम प्राप्त करने का प्रयास std::future_error फेंकना चाहिए।std :: packaged_task विनाश पर वादे तोड़ नहीं?

हालांकि, विजुअल स्टूडियो 2013 पर यह मामला प्रतीत नहीं होता है। इस निम्नलिखित कोड डालें:

#include <iostream> 
#include <future> 
#include <functional> 

int main() { 
    std::future<int> f; 
    { 
     std::packaged_task<int()> task([](){return 3; }); 
     f = task.get_future(); 
    } 
    std::cout<<f.get()<<std::endl; 
    return 0; 
} 

मैं पैक कार्य के लिए इंतजार कर निष्पादित करने के लिए एक std::future_errorf.get() पर लेकिन इसके बजाय यह ब्लॉक पाने के लिए उम्मीद कर रहा हूँ,।

एक और संकलक कोशिश कर रहा है: http://ideone.com/Wt0WOc वास्तव में एक std::future_error("Broken promise") ...

Am मैं दृश्य स्टूडियो 2013 में एक बग को देखने या मैं कुछ चूक गए फेंक करता है?

उत्तर

10

आप कर रहे हैं सही बात। ~packaged_task() साझा स्थिति (§30.6.9.1 [futures.task.members]/p9) को छोड़ देता है, जिसका अर्थ है, यदि साझा स्थिति तैयार नहीं है, तो की अपवाद ऑब्जेक्ट को broken_promise की त्रुटि स्थिति के साथ संग्रहीत करना, फिर साझा स्थिति बनाना तैयार; और उसके बाद साझा स्थिति (§30.6.4 [futures.state]/p7 जारी)।

यह एक known bug है कि दृश्य स्टूडियो के अगले संस्करण है, जो 2015 यह भी CTP में ठीक किया गया है में कुछ समय के बाहर आने की संभावना है, लेकिन यह एक बहुत बुरा विचार का उपयोग करने कि उत्पादन कोड के लिए है में will be fixed ..

+0

तो क्या मैंने उन लिंक को सही ढंग से पढ़ा, यह वीएस 2013 में तय नहीं किया जाएगा? –

+0

@EmilyL। मैं बहुत असंभव कहूंगा। [इस पृष्ठ के एफएक्यू अनुभाग में [Q5] के अनुसार] (http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking -changes-in-vs-2013.aspx), वे केवल दुर्लभ रूप से बगफिक्स का बैकपोर्ट करते हैं। –

+2

बढ़िया, हमने खरीदा स्टूडियो मुश्किल से एक वर्ष पुराना है और वे पहले से ही हमें चुटकी में छोड़ रहे हैं। * श्वास * पुष्टि के लिए धन्यवाद। इस जवाब को स्वीकार करते हुए लिंक ने मेरे संदेहों पर अंतिम पुष्टि की। –

7

मुझे लगता है कि यह एक बग है, मानक कहता है कि ~packaged_task साझा स्थिति को छोड़ देता है, जिसका अर्थ है कि यदि यह तैयार नहीं है तो इसे broken_promise अपवाद स्टोर करना चाहिए और जैसा कि आप उम्मीद करते हैं, राज्य को तैयार करना चाहिए।

पूर्ण प्रकटीकरण: अपने ideone.com परीक्षण जीसीसी का उपयोग करता है और मैं कार्यान्वित जीसीसी के <future> तो मैं पक्षपाती हो सकता है जब मैं कहता हूँ अपने व्यवहार सही है ... लेकिन मुझे लगता है कि यह अभी भी सही है ;-)

+0

पूरी तरह से सहमत हुए। एक छोड़ा गया 'भविष्य' (यानी इस मामले में वापसी मूल्य) * 'break_promise' की स्थिति * है। – starturtle

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