2016-09-30 106 views
0

是否有可能不等待来自线程函数的返回值?例如稍后检查值是否曾经返回,并在该函数执行时执行其他操作?我的意思是,如果你不得不等待函数返回,那么它就不是真正的多线程,因为你可以直接调用函数。C++稍后从线程函数中获取返回值

#include <thread> 
#include <future> 

int func_1(int x) 
{ 
    return x; //Assume this takes several seconds to complete 
} 

int main() 
{ 
     auto future = std::async(func_1, 2); 

     int number = future.get(); //Whole program waits for this 

     //More code later 

     while(!number) //Check if number ever returned? 
     { 
      //Wait for it or assume some error/default 
     } 
     return 0; 
} 
+1

*“整个程序等待这个”*当然是的,你明确地告诉过它。在需要之前不要“得到”结果。阅读[文档](http://en.cppreference.com/w/cpp/thread/future)。 –

+1

您可以明确使用启动类型'std :: async(std :: launch :: async,...)',否则不能确保函数在单独的线程中运行。 – Trevir

回答

2

您正在请求结果,而不是做其他事情,然后在需要时得到结果。如果你这样做:

int main() 
{ 
     auto future = std::async(func_1, 2);   

     //More code later 

     int number = future.get(); //Whole program waits for this 

     // Do something with number 

     return 0; 
} 

然后你就可以做别的事情在More code later位,然后当你需要通过调用get()的结果框。

或者,您可以使用wait_forwait_until轮询以查看该值是否可用,并在结果未准备好时执行操作。

2

你可以检查,如果未来是通过调用future::wait_for零超时和检查返回值等于future_status::ready准备。

Btw:std::async返回特殊期货,您应该考虑是否真的想要使用它。更详细的信息:http://scottmeyers.blogspot.com/2013/03/stdfutures-from-stdasync-arent-special.html

+0

啊我不好。我似乎误解了未来的工作方式。所以它执行线程并在后台保留答案,直到你获取它是正确的? – nurtul

+0

非常多,除了它不一定要在另一个线程中执行(它可以在同一个线程中延迟,例如在计算相当昂贵但不总是需要的情况下) – krzaq