एक std :: भविष्य की स्थिति प्राप्त करें


83

क्या यह जांचना संभव है कि क्या std::futureसमाप्त हो गया है या नहीं? जहां तक ​​मैं यह करने का एकमात्र तरीका बता सकता हूं कि यह wait_forशून्य अवधि के साथ कॉल करना और जांचना होगा कि स्थिति है readyया नहीं, लेकिन क्या कोई बेहतर तरीका है?


10
@CatPlusPlus अनलाइक आई एम मिस्टेक, validकेवल चेक करता है कि भविष्य में एक साझा स्थिति है (यानी यह भविष्य में आने trueतक वापस लौटता getहै)।
डेविड ब्राउन

तो, अगर getबुलाया गया है और संग्रहीत मूल्य लौटाता है, तो क्या आप अभी भी चाहते हैं true? (मुझे यकीन नहीं है कि यह उपयोगी क्यों होगा, क्योंकि आप केवल एक बार ही मूल्य प्राप्त कर सकते हैं।)
जेम्स मैकनेलिस

@JamesMcNellis शायद मैं गलतफहमी या गलतफहमी का सामना कर रहा हूं, लेकिन मैं यह जानना चाहता हूं कि अगर धागा (या जो भी गणना कर रहा है) समाप्त हो गया है या नहीं। QFuture::isFinishedमूल रूप से Qt के बराबर ।
डेविड ब्राउन

1
शून्य टाइमआउट के साथ एक प्रतीक्षा यह है कि इस तरह की अवधारणा से निपटने के लिए कई प्लेटफार्मों में सबसे अधिक एपीआई कैसे हैं ... इतना है कि मैं इसे अवधारणा के दृष्टिकोण का "मानक" तरीका मानूंगा। यह मुझे "एक बेहतर तरीका" की धारणा पर हैरान कर देता है ...
asveikau

16
@asikikau मुझे नहीं पता था कि यह एक मानक अभ्यास था। जब मैं इंतजार नहीं करना चाहता हूं तो एक प्रतीक्षा समारोह को कॉल करना अजीब लगता है।
डेविड ब्राउन

जवाबों:


85

आप सही हैं, और wait_untilअतीत में एक समय के साथ कॉल करने के अलावा (जो समकक्ष है) कोई बेहतर तरीका नहीं है।

यदि आप एक अधिक सुविधाजनक वाक्यविन्यास चाहते हैं तो आप हमेशा थोड़ा रैपर लिख सकते हैं:

template<typename R>
  bool is_ready(std::future<R> const& f)
  { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }

एनबी अगर फ़ंक्शन को स्थगित कर दिया गया है तो यह कभी भी सच नहीं होगा, इसलिए यह संभवतः wait_forउस मामले में सीधे जांच करना बेहतर है जहां आप निश्चित समय बीत जाने के बाद या सिस्टम लोड कम होने पर समकालिक कार्य को समान रूप से चलाना चाहते हैं।


2
Wait_for भविष्य को म्यूट नहीं करता है इसलिए पैरामीटर को कॉन्स्टेबल घोषित किया जा सकता है।
जेन्स Jकेब्लोम

7
यदि पहले से ही कॉल किया गया था या भविष्य को कभी भी आरंभ नहीं किया गया था, तो रन टाइम त्रुटियों से बचने के लिए पहले वैध () जाँच पर विचार करें।
जेरेमी सोरेंसन

5
क्या Wait_for (chrono :: seconds (0)) तुरंत वापस लौटने की गारंटी है या क्या यह कुछ कार्यान्वयनों पर कुछ मिलीसेकंड के लिए धागे के नियंत्रण का उत्पादन कर सकता है? यह जानना बहुत महत्वपूर्ण होगा क्योंकि एक खेल को कोड करने के लिए मिलीसेकंड के एक जोड़े के रूप में बहुत समय होता है ...
kynnysmatto

9
@kynnysmatto, कुछ कार्यान्वयनों पर यह भविष्य की स्थिति का सुरक्षित निरीक्षण करने के लिए एक म्यूटेक्स लॉक प्राप्त करता है, इसलिए यदि उस लॉक का बचाव किया जाता है (क्योंकि एक और धागा राज्य को तैयार कर रहा है, या तत्परता के लिए भी जाँच कर रहा है) तो यह ब्लॉक हो जाएगा, और एक और धागा भाग सकता है, लेकिन एक अच्छे कार्यान्वयन पर म्यूटेक्स को कुछ निर्देशों से अधिक के लिए कभी भी आयोजित नहीं किया जाना चाहिए, इसलिए एक मिलीसेकंड भी नहीं। जीसीसी के वर्तमान कार्यान्वयन में एक म्यूटेक्स का उपयोग नहीं किया गया है, लेकिन पिछले एक ने किया और राज्य को तैयार करने के लिए दो बिंदुओं की अदला-बदली की गई है, इसलिए म्यूटेक्स बहुत संक्षेप में बंद हो जाता है जबकि ऐसा होता है।
जोनाथन वेकली

@JonathanWakely जी + के साथ परीक्षण for(int i = 0; i < 1000; i++) f.wait_for(chrono::seconds(0));दीवार घड़ी समय के 43ms लेता है।
डैनियल किंसमैन

15

वहाँ st_ :: भविष्य के लिए कार्यों में एक is_ready सदस्य फ़ंक्शन है । इस बीच, वीसी कार्यान्वयन में एक _Is_ready () सदस्य है।


ध्यान दें कि _Is_ready () सदस्य फ़ंक्शन थ्रेड-सुरक्षित नहीं है। यह संबंधित राज्य के _Ready झंडे को अनपेक्षित तरीके से एक्सेस करता है। यह कम से कम VS2019 16.2 के मामले में है।
मटियास डे चारलेरॉय

10

मेरी पहली शर्त wait_for0 अवधि के साथ कॉल करना और परिणाम कोड की जांच करना होगा जो कि future_status::ready, future_status::deferredया में से एक हो सकता है future_status::timeout

में cppreference वे दावा करते हैं कि valid() जांच करता है कि परिणाम उपलब्ध है , लेकिन मानक का कहना है कि valid()वापस आ जाएगी trueअगर *thisएक साझा राज्य को संदर्भित करता है कि क्या है कि राज्य है की स्वतंत्र रूप से, तैयार है या नहीं।


7
cppreference अब अपडेट किया गया है और बताता है कि "भविष्य में साझा राज्य है या नहीं" चेक। (यदि आप अपने दूसरे पैराग्राफ को हटाना चाहते हैं या संपादित करना चाहते हैं, तो निश्चित नहीं है, इसलिए मैं इसे स्वयं संशोधित नहीं करूँगा)।
डिफॉल्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.