2010-12-13 21 views
6

मैं से http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.htmlअतुल्यकालिक समारोह कॉल C++ 0x

int calculate_the_answer_to_LtUaE(){ 
    sleep(5); 
cout << "Aaa" << endl; 
} 

    std::future<int> the_answer=std::async(calculate_the_answer_to_LtUaE); 
    the_answer.get(); 
    cout << "finish calling" << endl; 
    sleep(10000); 

मैं calculate_the_answer_to_LtUaE (आह्वान करने के लिए the_answer.get() कॉल करने की आवश्यकता कोड के साथ std :: async समारोह पर परीक्षण कर रहा हूँ) और एएए मिल स्क्रीन पर मुद्रित। अगर मैंने the_answer.get() लाइन पर टिप्पणी की है, तो मुझे कुछ भी मुद्रित नहीं होगा। क्या यह std :: async फ़ंक्शन का इच्छित व्यवहार है या मैं यहां कुछ गलत कर रहा हूं? ऐसा इसलिए है क्योंकि मैंने सोचा था कि_answer.get() का उपयोग फ़ंक्शन को पूरा करने और परिणाम पुनर्प्राप्त करने के लिए किया जाता है।

धन्यवाद।

+1

मेरा अनुमान है, जो व्यवहार आप देख रहे हैं मानक के अनुसार अनुमेय व्यवहार है, भले ही यह बहुत उप इष्टतम है। अब, पूरी चीज भी टूटी हुई है क्योंकि आपके पास 'calculate_the_answer_to_LtUaE' के अंत में 'वापसी' नहीं है। – Omnifarious

उत्तर

5

यदि आप 'लॉन्च पॉलिसीज' के बारे में लिंक की गई चीज़ के अनुभाग को पढ़ते हैं तो आप देखेंगे कि मैं अपनी टिप्पणी में बिल्कुल सही हूं। जो व्यवहार आप देख रहे हैं वह पूरी तरह स्वीकार्य है।

आप मजबूर कर सकते हैं जो आपके द्वारा अब की तरह लांच नीति का उपयोग करना चाहते हैं:

std::future<int> the_answer=std::async(std::launch::async,calculate_the_answer_to_LtUaE); 
4

"std :: async के लिए डिफ़ॉल्ट लॉन्च नीति std :: launch :: any है, जिसका अर्थ है कि कार्यान्वयन आपके लिए चुनना है।"

आप std::launch::async की जरूरत है, मूल रूप से:

std::future<int> the_answer=std::async(std::launch::async, calculate_the_answer_to_LtUaE); 
//          ^^^^^^^^^^^^^^^^^^ 

सुनिश्चित करें कि async कॉल एक नया सूत्र में रख दिया जाता है बनाने के लिए। अन्यथा यह the_answer.get() तक गणना फ़ंक्शन को कॉल कर सकता है और इसे वर्तमान थ्रेड में आमंत्रित कर सकता है।

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