2010-12-13 19 views
6

Estoy probando la función std :: asíncrono con el código de http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.htmlfunción asíncrona llamada 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); 

necesito llamar the_answer.get() para invocar calculate_the_answer_to_LtUaE() y obtener el Aaa impreso en la pantalla. Si comenté la línea the_answer.get(), no obtendría nada impreso. ¿Es este el comportamiento previsto de la función std :: async o estoy haciendo algo mal aquí? Esto es porque pensé que the_answer.get() se usa para esperar que la función se complete y para recuperar el resultado.

Gracias.

+1

Mi conjetura es que el comportamiento que se está viendo es un comportamiento admisible de acuerdo con la norma, a pesar de que es muy inferior al óptimo. Ahora, todo el asunto también está roto porque no tienes un 'return' al final de' calculate_the_answer_to_LtUaE'. – Omnifarious

Respuesta

5

Si lees la sección de lo que has vinculado sobre "políticas de inicio de sesión", verás que estoy exactamente en lo cierto en mi comentario. El comportamiento que estás viendo es perfectamente permisible.

Puede forzar lo que desee mediante la política de lanzamiento de este modo:

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

"La política de inicio predeterminada para std :: async es std :: launch :: any, lo que significa que la implementación puede elegir por usted".

Es necesario std::launch::async, básicamente:

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

Para asegurarse de que la llamada asincrónica se coloca en un nuevo hilo. De lo contrario, puede posponer llamar a la función de cálculo hasta el the_answer.get() e invocarlo en el hilo actual.