2010-12-13 16 views
6

ja testuje funkcję std :: asynchronicznym z kodem z http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.htmlasynchroniczna funkcja 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); 

Muszę zadzwonić the_answer.get(), aby wywołać calculate_the_answer_to_LtUaE() i uzyskać Aaa wydrukowane na ekranie. Gdybym skomentował linię the_answer.get(), nic nie wydrukowałbym. Czy jest to zamierzone zachowanie funkcji std :: async, czy też robię coś złego tutaj? Jest tak, ponieważ myślałem, że the_answer.get() jest używany do czekania na zakończenie funkcji i pobrania wyniku.

Dzięki.

+1

Domyślam się, że zachowanie widzisz zachowanie jest dopuszczalne zgodnie z normą, chociaż jest to bardzo nieoptymalne. Teraz wszystko jest zepsute, ponieważ nie masz 'return' na końcu' calcul_the_answer_to_LtUaE'. – Omnifarious

Odpowiedz

5

Jeśli przeczytasz sekcję rzeczy, z którą łączyłeś się o "zasadach uruchamiania", zobaczysz, że mam dokładnie rację w moim komentarzu. Obserwowane zachowanie jest całkowicie dopuszczalne.

Można wymusić co chcesz za pomocą polityki uruchamiania tak:

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

"Domyślną zasadą uruchamiania dla std :: async jest std :: launch :: any, co oznacza, że ​​implementacja będzie wybierać dla ciebie."

Trzeba std::launch::async, w zasadzie:

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

Aby upewnić się, że wywołanie asynchroniczne zostanie umieszczony w nowym wątku. W przeciwnym razie może po prostu odłożyć wywołanie funkcji obliczeniowej do the_answer.get() i wywołać ją w bieżącym wątku.