2014-05-04 5 views
27

जब एक और Stackoverflow question जवाब देने के लिए कोशिश कर रहा है, मुझे एहसास हुआ कि इस सरल सी ++ 11 टुकड़ा परोक्ष बुला धागा ब्लॉक कर रहा है:भविष्य का विनाशक 'std :: async` अवरुद्ध से क्यों लौटाया गया है?

std::async(std::launch::async, run_async_task) 
मेरे लिए

इस एक काम शुरू करने के लिए विहित सी ++ 11 तरीका प्रतीत होते थे परिणाम के बारे में देखभाल किए बिना असीमित रूप से। इसे प्राप्त करने के लिए इसके बजाय किसी को स्पष्ट रूप से स्पष्ट रूप से एक धागा बनाना और अलग करना है (answer निर्दिष्ट प्रश्न के लिए)।

तो मेरा प्रश्न यहां है: क्या सुरक्षा/शुद्धता के संबंध में कोई कारण है कि std::future के विनाशक को अवरुद्ध करना है? अगर यह get पर ब्लॉक करता है तो यह पर्याप्त नहीं होगा और अन्यथा, अगर मुझे वापसी मूल्य या अपवाद में कोई दिलचस्पी नहीं है, तो यह केवल आग लगती है और भूल जाती है?

+0

बस अपनी टिप्पणी का उत्तर दिया और यहां आपके पास एक प्रश्न है – texasbruce

+1

इस व्यवहार पर बहुत सी चर्चा हुई थी। निम्नलिखित दस्तावेजों पर नज़र डालें: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3773.pdf और http://www.open-std.org/jtc1/ sc22/wg21/दस्तावेज़/कागजात/2013/n3776.pdf – nosid

+1

@texasbruce: हाँ, क्योंकि यह वास्तव में मुझे खराब करता है। मुझे यकीन था कि यह * करने के लिए * नया सी ++ 11y तरीका है और मुझे वास्तव में यह देखने के लिए आश्चर्य हुआ कि अगर मुझे परिणाम की परवाह नहीं है (केवल अंत में एक नोट में उल्लिखित)। जब तक कि इसके लिए स्पष्ट आवश्यकता न हो, मुझे नहीं लगता कि यह एक अच्छा इंटरफ़ेस है। –

उत्तर

23

std :: async और धागे द्वारा लौटाए गए वायदा के विनाशकों को अवरुद्ध करना: यह एक विवादास्पद विषय है। हर्ब द्वारा

हालांकि चर्चा का एक बहुत कुछ था, वहाँ के बारे में के लिए सी ++ 14 की योजना बनाई में कोई बदलाव नहीं कर रहे हैं std :: भविष्य और std :: thread के विनाशकों के व्यवहार को अवरुद्ध करना।

आपके प्रश्न के बारे में, सबसे दिलचस्प पेपर शायद हंस बोहेम द्वारा दूसरा स्थान है। मैं आपके प्रश्न का उत्तर देने के लिए कुछ हिस्सों का उद्धरण देता हूं।

N3679: Async() future destructors must wait

[..] जुड़े साझा राज्य के लिए अपने नाशक में साथ async लॉन्च नीति इंतजार async() द्वारा दिया फ्यूचर्स तैयार हो गया है। यह ऐसी परिस्थिति को रोकता है जिसमें संबंधित धागा चल रहा है, और अब पूरा होने का इंतजार करने का कोई साधन नहीं है क्योंकि संबंधित भविष्य नष्ट हो गया है। अन्यथा पूरा होने की प्रतीक्षा करने के वीर प्रयासों के बिना, इस तरह के "रन-दूर" धागे उन वस्तुओं के जीवनकाल से पहले चल सकते हैं जिन पर यह निर्भर करता है।

[उदाहरण]

अंतिम परिणाम एक पार धागा "स्मृति तोड़" होने की संभावना है। get() या wait() को [..] वे [वायदा] नष्ट होने से पहले [..] कहा जाता है, तो यह समस्या निश्चित रूप से टाल जाती है। कठिनाई [..] यह है कि एक अप्रत्याशित अपवाद उस कोड को बाधित कर सकता है।इस प्रकार सुरक्षा सुनिश्चित करने के लिए आमतौर पर कुछ प्रकार के स्कोप गार्ड की आवश्यकता होती है। यदि प्रोग्रामर स्कोप गार्ड को जोड़ना भूल जाता है, तो ऐसा लगता है कि एक हमलावर उत्पन्न कर सकता है उदा। पर्यवेक्षण का लाभ उठाने के लिए एक उपयुक्त बिंदु पर एक bad_alloc अपवाद, और एक ढेर को ओवरराइट करने का कारण बनता है। स्टैक को ओवरराइट करने के लिए उपयोग किए गए डेटा को भी नियंत्रित करना संभव हो सकता है, और इस प्रकार प्रक्रिया पर नियंत्रण प्राप्त हो सकता है। यह एक पर्याप्त सूक्ष्म त्रुटि है कि, हमारे अनुभव में, वास्तविक कोड में इसे अनदेखा किया जा सकता है।

अद्यतन: मुद्दा async विनाशकर्ता कि पर

The View from the C++ Standard meeting September 2013 Part 2 of 2.

: माइकल वोंग के ट्रिप रिपोर्ट सितंबर 2013 में बैठक के परिणामों के बारे में कुछ रोचक जानकारी शामिल है ब्लॉक नहीं करना चाहिए हम इस पर चर्चा का एक बड़ा सौदा समर्पित है। [..] एकमात्र स्थिति जिसने काफी समर्थन प्राप्त किया था [..] सलाह दे रहा था कि भविष्य के विनाशक ब्लॉक नहीं करेंगे, जब तक कि एसिंक से वापस नहीं आते, यह उल्लेखनीय अपवाद बनाते हैं। [..] महत्वपूर्ण चर्चा के बाद, एकमात्र हिस्सा जिसे हमने ले जाने की कोशिश की थी, वह N3776 था, ~future और ~shared_future स्थिति को स्पष्ट करने का प्रयास संभवतः एसिंक की उपस्थिति को छोड़कर ब्लॉक न करें। प्रतिस्थापन के बिना सी Deprecate async की लाइनों के साथ एक बहिष्करण जारी करने का प्रयास किया गया था। यह गति वास्तव में लगभग आगे रखा गया था। लेकिन [..] यह ऑपरेटिंग टेबल तक पहुंचने से पहले भी मर गया।

+1

बढ़िया, ठीक उसी प्रकार का उत्तर जिसे मैं ढूंढ रहा था! अभी भी यह विश्वास नहीं है कि यह सही निर्णय था, लेकिन कम से कम व्यापार-बंद अब मुझे स्पष्ट हैं। मुझे लगता है कि यह आरएआईआई का कुछ चरम रूप है, यह सुनिश्चित करने के लिए कि विनाशक में एक फ़ाइल हैंडलर बंद है। –

+1

इसे सी ++ 14 में तय करने के बारे में, यह प्रस्ताव मुझे लगता है जैसे: [n3773] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3773। पीडीएफ)। या कम से कम यह आपको मैन्युअल रूप से 'अलग' करने की संभावना देता है। –

+2

मुझे यकीन था कि मैंने चर्चाओं के नतीजे पर कुछ जानकारी देखी है। अब मैंने इसे पाया है और जवाब अपडेट किया है। – nosid

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