2012-10-08 14 views
9

यह जब तक आप std::async फोन एक std::futurefuture_status::deferred से किसी भी अन्य राज्य के लिए सेट कभी नहीं की जाएगी कि जब तक आप भविष्य पर get या wait फोन लगता है। wait_for & wait_until ब्लॉक को जारी नहीं रखेगा और future_status::deferred वापस लौटाएगा भले ही कार्य पहले ही चल रहा है और परिणाम संग्रहीत कर चुका है।std :: भविष्य अभी भी टाल जब std :: packaged_task (VS11) का उपयोग कर

यहाँ एक उदाहरण है:

#include <future> 

void main() 
{ 
    auto func = []() { return 5; }; 
    auto asyncFuture = std::async(std::launch::async, func); 
    auto status = asyncFuture.wait_for(std::chrono::seconds(0)); // timeout (1) 

    auto deferredFuture = std::async(std::launch::deferred, func); 
    status = deferredFuture.wait_for(std::chrono::seconds(0));  // deferred (2) 

    std::packaged_task<int()> task(func); 
    auto packagedTaskFuture = task.get_future(); 
    status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2) 

    task(); 

    status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2) 
    packagedTaskFuture.wait(); 
    status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // ready (0) 
} 

मैं वर्तमान सी ++ 11 मानक की जरूरत नहीं है, लेकिन 30.6.9 में मसौदा मानक का कहना है कि उस में परिणाम संग्रहीत करना चाहिए जब एक packaged_task चलाया जाता है भविष्य का साझा राज्य। यह बहुत स्पष्ट नहीं है कि इसमें अपेक्षित wait_until/wait_for व्यवहार स्थापित करना शामिल है या नहीं।

वहाँ पहले से async कॉल के संबंध में इस क्षेत्र में VS11 व्यवहार के साथ मुद्दे थे: http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c

साथ ही ऐसा लगता है अन्य compilers की तरह इस क्षेत्र में समस्याएं हैं: C++ 11 future_status::deferred not working

किसी को भी है कि मानक बेहतर जानते हो सकता है: क्या यह अपेक्षित व्यवहार है या वीएस 11 में लागू होने के साथ कोई समस्या है?

अपडेट: http://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task

+0

वही स्थगित स्थिति दुर्भाग्यवश वीएस 11 - अपडेट 1 का उपयोग करके प्राप्त की जाती है, जब भविष्य वादे से प्राप्त होता है (यह async के साथ काम करता है)। कुछ समय पहले उन्हें यह मुद्दा बताया गया था लेकिन अभी भी काम नहीं कर रहा है। यह कई मामलों में std :: भविष्य का उपयोग करने के उद्देश्य को व्यावहारिक रूप से हरा देता है। कम से कम 1.51 बूस्ट के साथ काम करता है। – Ghita

उत्तर

12

यह VS2012 के साथ एक मुद्दा है: मैं किसी भी तरह इस के लिए रिपोर्ट याद किया। यह एकमात्र मुद्दा नहीं है --- सी ++ 11 थ्रेड लाइब्रेरी के उनके कार्यान्वयन में कई बग हैं। मैंने कुछ on my blog के बारे में लिखा था।

+0

धन्यवाद! मुझे पता था कि वीएस 11 सी ++ 11 एसटीएल समर्थन इतना अच्छा नहीं था, लेकिन मुझे नहीं लगता था कि यह पूरी तरह से अनुपयोगी होगा। इन सुविधाओं के बूस्ट के कार्यान्वयन पर कोई टिप्पणी (जाहिर है एसिंक या चीजें जिन्हें उन्होंने अभी तक लागू नहीं किया है)? –

+0

कार्यान्वयन की गई सुविधाओं के लिए बढ़ावा कार्यान्वयन आम तौर पर ध्वनि होता है। कुछ बग हैं, लेकिन हम उन पर काम कर रहे हैं, और Vicente गायब सी ++ 11 सुविधाओं पर काम कर रहा है। –

+0

@ एंथनी विल्लियम्स बढ़ावा समर्थन के लिए धन्यवाद। यह कुछ ऐसा है जिस पर इस – Ghita

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