std :: async работает только синхронно - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь добавить асинхронный метод в мой класс A Star. Я хочу иметь возможность вычислять путь асинхронно, чтобы каждый агент мог найти свой путь независимо от других агентов.

Проблема в том, что в данный момент кажется, что программа ожидает завершения потока. Как я могу выполнить каждый вызов асинхронно?

Функция

bool simplePath::navAgent::findPathAsync(int _startX, int _startY, int _endX, int _endY){
    auto t1 = std::async([&]{return this->findPath(_startX,_startY,_endX,_endY);});
    t1.get();
    return true;
}

Вызов

navComponent->findPathAsync(0,2,30,45);
    navComponent->findPathAsync(0,2,123,100);
    navComponent->findPathAsync(0,2,8,7);
    navComponent->findPathAsync(0,2,8,7);
    navComponent->findPathAsync(0,2,8,7);
    navComponent->findPathAsync(0,2,8,7);
    navComponent->findPathAsync(0,2,8,7);

В чем здесь моя ошибка?

1 Ответ

0 голосов
/ 07 ноября 2018

Когда вы звоните t1.get(), ваш код ожидает вычисления результата.

Когда вы запускаете свои задачи, вы не указываете политику запуска, поэтому вы используете политику по умолчанию std::launch::async | std::launch::deferred, которая может вообще не запускать отдельный поток и может просто лениво оцениваться при вызове t1.get().

Вам нужно изменить лямбду на захват по значению, а не по ссылке, поскольку целочисленные параметры, на которые вы ссылаетесь, могут больше не существовать при выполнении вашей лямбды.

Полностью рабочий пример:

std::future<bool> simplePath::navAgent::findPathAsync(int _startX, int _startY, int _endX, int _endY){
    return std::async(std::launch::async, []{return this->findPath(_startX,_startY,_endX,_endY);});
}

std::vector< std::future_bool > results;
results.emplace_back(navComponent->findPathAsync(0,2,30,45));
results.emplace_back(navComponent->findPathAsync(0,2,123,100));
results.emplace_back(navComponent->findPathAsync(0,2,8,7));
results.emplace_back(navComponent->findPathAsync(0,2,8,7));
results.emplace_back(navComponent->findPathAsync(0,2,8,7));
results.emplace_back(navComponent->findPathAsync(0,2,8,7));
results.emplace_back(navComponent->findPathAsync(0,2,8,7));

bool result = true;
for ( auto& f : results )
{
    result &= f.get();
}
...