gpt4 book ai didi

c++ - std::async 仅同步工作

转载 作者:行者123 更新时间:2023-11-30 03:20:02 27 4
gpt4 key购买 nike

我正在尝试向我的 A 星级类(class)添加一个异步方法。我希望能够异步计算路径,以便每个代理都能独立于其他代理找到自己的路径。

问题是,目前程序似乎正在等待线程完成。我如何异步执行每个调用?

函数

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

我这里的错误是什么?

最佳答案

当您调用 t1.get() 时,您的代码正在等待计算结果。

当您启动任务时,您没有指定启动策略,因此您使用的是 std::launch::async | 的默认策略。 std::launch::deferred 可能根本不会启动一个单独的线程,并且可以在您调用 t1.get() 时延迟计算。

您需要将 lambda 更改为按值捕获而不是按引用捕获,因为在执行 lambda 时您引用的整数参数可能不再存在。

一个完整的例子是:

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

关于c++ - std::async 仅同步工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53185372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com