को अवरुद्ध नहीं करता है मेरे पास एक बहुप्रचारित एप्लिकेशन है, जिसमें उपयोगकर्ता इनपुट के लिए मुख्य थ्रेड के रूप में प्रतीक्षा करने वाला लूप है। सही इनपुट पर, यह लूप को रोकना और अन्य सभी धागे के लिए प्रतीक्षा करना है, ताकि अंततः समाप्त हो सके।std :: सूची <std::future> विनाशक
इस प्रयोजन के लिए मैं एक std :: सूची जिसमें मैं एसटीडी डाल :: भविष्य वस्तुओं धागा निर्माण के लिए
std::list<std::future<int>> threads;
threads.emplace_front(std::async(std::launch::async, ...));
मैं यह धारणा थी बनाया बनाया है, कि दे सूची गुंजाइश से बाहर निकलता है, तब तक ब्लॉक करना चाहिए जब तक कि सभी धागे अपने मुख्य कार्य को वापस न करें, क्योंकि सूची एस विनाशक std :: भविष्य तत्वों और the destructor of those थ्रेड समाप्त होने के लिए प्रतीक्षा करेगा।
संपादित करें: चूंकि यह प्रासंगिक है मैं इसे यहाँ जोड़ देगा:, यह दृश्य स्टूडियो में MSVC संस्करण 2013 व्यावसायिक /संपादित करें
साथ Win7 पर है जब मैं इस कोशिश की उसने ऐसा नहीं किया ब्लॉक, मुझे
for (auto it = threads.begin(); it != threads.end(); ++it) {
it->get();
}
फ़ंक्शन के अंत में सही ढंग से ब्लॉक करने के लिए जोड़ना था।
क्या मुझे कुछ गलत समझना पड़ा, या क्या मुझे धागे को अलग तरीके से बनाना है, जो मैं यहां करना चाहता हूं?
@ टी.सी.आईफ़ यह वास्तव में इतना आसान है, और मुझे उन पर भरोसा नहीं करना चाहिए, आपको इसे एक उत्तर के रूप में जोड़ना चाहिए, इसलिए मैं इसे स्वीकार कर सकता हूं – Ongy
एक बग की तरह दिखता है। कंपाइलर क्या है? – ixSci
हम्म, स्कॉट मेयर्स [एक अच्छा तर्क देता है] (http://scottmeyers.blogspot.com/2013/03/stdfutures-from-stdasync-arent-special.html) कि 'std :: async' के विनिर्देश के लिए इसकी आवश्यकता है रुकावट के लिए। दिलचस्प ... –