2012-09-27 16 views
88

मैं भविष्य और एक वादे के बीच अंतर के साथ खुद को भ्रमित कर रहा हूं।फ्यूचर्स बनाम वादे

जाहिर है, उनके पास विभिन्न विधियां और सामान हैं, लेकिन वास्तविक उपयोग केस क्या है?

यह

  • ?: जब मैं कुछ async कार्य प्रबंध कर रहा हूँ है, मैं भविष्य का उपयोग करें "भविष्य में" मूल्य प्राप्त करने के
  • जब मैं async कार्य हूँ, मैं के रूप में वादा का उपयोग उपयोगकर्ता को मेरे वादे से भविष्य प्राप्त करने की अनुमति देने के लिए वापसी प्रकार
+0

मैंने इस बारे में कुछ लिखा [इस जवाब में] (http://stackoverflow.com/a/12335206/596781)। –

+1

संभव डुप्लिकेट [std :: वादा क्या है?] (Http://stackoverflow.com/questions/11004273/what-is-stdpromise) –

उत्तर

118

भविष्य और वादा एक असीमित संचालन के दो अलग-अलग पक्ष हैं।

std::promise एसिंक्रोनस ऑपरेशन के "निर्माता/लेखक" द्वारा उपयोग किया जाता है।

std::future एसिंक्रोनस ऑपरेशन के "उपभोक्ता/पाठक" द्वारा उपयोग किया जाता है।

कारण यह दो अलग "इंटरफेस" में अलग हो गया है "उपभोक्ता/पाठक" से "लिखना/सेट" कार्यक्षमता छुपाएं।

auto promise = std::promise<std::string>(); 

auto producer = std::thread([&] 
{ 
    promise.set_value("Hello World"); 
}); 

auto future = promise.get_future(); 

auto consumer = std::thread([&] 
{ 
    std::cout << future.get(); 
}); 

producer.join(); 
consumer.join(); 

एक (अधूरा) जिस तरह से लागू करने के लिए एसटीडी :: एसटीडी का उपयोग कर async :: वादा हो सकता है:

template<typename F> 
auto async(F&& func) -> std::future<decltype(func())> 
{ 
    typedef decltype(func()) result_type; 

    auto promise = std::promise<result_type>(); 
    auto future = promise.get_future(); 

    std::thread(std::bind([=](std::promise<result_type>& promise) 
    { 
     try 
     { 
      promise.set_value(func()); // Note: Will not work with std::promise<void>. Needs some meta-template programming which is out of scope for this question. 
     } 
     catch(...) 
     { 
      promise.set_exception(std::current_exception()); 
     } 
    }, std::move(promise))).detach(); 

    return std::move(future); 
} 

std::packaged_task जो एक सहायक है का उपयोग करते हुए (यानी यह मूल रूप से है कि हम क्या कर रहे थे ऊपर करता है) कि इस std::async से थोड़ा भिन्न है

template<typename F> 
auto async(F&& func) -> std::future<decltype(func())> 
{ 
    auto task = std::packaged_task<decltype(func())()>(std::forward<F>(func)); 
    auto future = task.get_future(); 

    std::thread(std::move(task)).detach(); 

    return std::move(future); 
} 

नोट: std::promise चारों ओर आप जिसके बाद और अधिक पूर्ण और संभवतः तेजी से होता है कर सकता है जहां std::future वापस आ जाएगा जब वास्तव में धागा समाप्त हो जाता है तब तक अवरुद्ध हो जाता है।

+1

@taras सुझाव देता है कि 'std :: move (कुछ) 'लौटाकर बेकार है और यह भी दर्द (एन) आरवीओ दर्द होता है। अपने संपादन को वापस कर रहा है। –

+0

विजुअल स्टूडियो 2015 में कृपया std :: cout << future.get() का उपयोग करें। C_str(); – Damian

+3

जो अभी भी उलझन में हैं, उनके लिए [यह उत्तर] देखें (http://stackoverflow.com/questions/11004273/what-is-stdpromise/12335206#12335206)। –

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