2010-12-13 53 views
6

ben calculate_the_answer_to_LtUaE (çağırmak için the_answer.get() çağırmanız gerekir http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.htmlasenkron işlev çağrısı 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); 

gelen kodla std :: zaman uyumsuz fonksiyonunu test ediyorum) ve almak Aaa Ekranda basılmış. The_answer.get() satırını yorumlamış olsaydım, yazdırılan hiçbir şeyi alamazdım. Bu std :: async işlevinin amaçlanan davranışı mı yoksa burada yanlış bir şey mi yapıyorum? Bunun nedeni, the_answer.get() işlevinin sonucu tamamlamak ve almak için işlevini beklemek için kullanıldığını düşündüğümdür.

Teşekkürler.

+1

Benim tahminim çok optimumun olsa bile görmekte olduğunuz davranış standardına göre izin verilen davranış olmasıdır. Şimdi, her şey de bozuldu çünkü 'calculate_the_answer_to_LtUaE' sonunda bir 'dönüş 'yok. – Omnifarious

cevap

5

'Başlatma politikaları' ile ilgili bağlandığınız şeyin bölümünü okursanız yorumumda tam olarak doğru olduğumu görürsünüz. Gördüğünüz davranışa kesinlikle izin verilebilir.

Sen şöyle fırlatma politikasını kullanarak istediğiniz neyi zorlayabilirsiniz:

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

"std :: async için varsayılan başlatma ilkesi std :: launch :: any, yani uygulamanın sizin için seçeceği anlamına gelir."

Temelde, std::launch::async gerekir:

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

zaman uyumsuz çağrı yeni bir iş parçacığı yerleştirilmiş ulaştığından emin olmak için. Aksi halde, the_answer.get() numaralı tarife kadar hesaplama fonksiyonunu çağırabilir ve mevcut konuya çağırır.