2016-09-30 11 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

*「全プログラムがこれを待っています」*もちろん、あなたは明示的に言いました。あなたがそれを必要とする前に、結果を「取得」しないでください。 [docs](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_forまたはwait_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

関連する問題