2010-12-13 23 views
6

私はcalculate_the_answer_to_LtUaEを(呼び出すためにthe_answer.get()を呼び出す必要が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); 

からのコードではstd ::非同期関数にテストしてい)とgetのAaa画面に印刷されます。私がthe_answer.get()行をコメントアウトしても、何も印刷されません。これはstd :: async関数の意図された動作ですか、私はここで何か間違っていますか?これは、関数が完了して結果を取得するのを待つためにthe_answer.get()が使用されていると考えたからです。

ありがとうございました。

+1

。今、 'calculate_the_answer_to_LtUaE'の最後に' return'がないので、すべてが壊れてしまいます。 – 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); 
//          ^^^^^^^^^^^^^^^^^^ 

は、非同期呼び出しが新しいスレッドに配置されることを確認するために。さもなければ、それはちょうどthe_answer.get()まで計算機能を呼び出すことを延期し、現在のスレッドでそれを呼び出すかもしれません。

関連する問題