вызов асинхронной функции C ++ 0x - PullRequest
6 голосов
/ 13 декабря 2010

Я тестирую функцию std :: async с кодом из http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html

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);

Мне нужно вызвать the_answer.get (), чтобы вызвать Calculate_the_answer_to_LtUaE () и вывести Aaa на экран. Если бы я закомментировал строку the_answer.get (), я бы ничего не напечатал. Это предполагаемое поведение функции std :: async или я что-то здесь не так делаю? Это потому, что я думал, что the_answer.get () используется для ожидания завершения функции и получения результата.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 13 декабря 2010

Если вы прочтете раздел, о котором вы говорили, о «политиках запуска», вы увидите, что я совершенно прав в своем комментарии.Поведение, которое вы видите, совершенно допустимо.

Вы можете принудительно установить желаемое с помощью политики запуска, например:

std::future<int> the_answer=std::async(std::launch::async,calculate_the_answer_to_LtUaE);
4 голосов
/ 13 декабря 2010

"Политика запуска по умолчанию для 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() и вызвать ее в текущем потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...