首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::异步只同步工作

std::异步只同步工作
EN

Stack Overflow用户
提问于 2018-11-07 07:52:05
回答 1查看 99关注 0票数 1

我试图在我的A星类中添加一个异步方法。我希望能够异步计算路径,因此每个代理都能够找到独立于其他代理的路径。

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

函数

代码语言:javascript
复制
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;
}

打电话

代码语言:javascript
复制
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);

我在这里犯了什么错?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-07 08:15:34

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

当您启动任务时,您没有指定启动策略,因此您使用的是std::launch::async | std::launch::deferred的默认策略,该策略可能根本不会启动单独的线程,并且可能只是在调用t1.get()时懒散地进行评估。

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

一个充分发挥作用的例子是:

代码语言:javascript
复制
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();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53185372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档