【发布时间】:2017-08-24 02:56:53
【问题描述】:
我正在尝试了解std::async、std::future 系统。我不太明白的是你如何处理运行多个异步“任务”,然后根据返回的第一个、第二个等,运行一些额外的代码。
示例:假设您的主线程处于一个简单的循环中。现在,根据用户输入,您通过std::async 运行多个函数,并将期货保存在std::list 中。
我的问题是,我如何从std::async 函数传回可以指定哪个未来已完成的信息?
我的主线程基本上处于消息循环中,我需要做的是让std::async 运行的函数能够将一条消息排队,该消息以某种方式指定哪个未来已完成。问题是该函数无法访问未来。
我只是错过了什么吗?
这是我想要完成的一些伪代码;如果有办法也有办法使用取消令牌调用“取消”请求,则可以加分。
class RequestA
{
public:
int input1;
int output1;
};
main()
{
while(1)
{
//check for completion
// i.e. pop next "message"
if(auto *completed_task = get_next_completed_task())
{
completed_task->run_continuation();
}
// other code to handle user input
if(userSaidRunA())
{
// note that I don't want to use a raw pointer but
// am not sure how to use future for this
RequestA *a = new RequestA();
run(a, OnRequestTypeAComplete);
}
}
}
void OnRequestTypeAComplete(RequestA &req)
{
// Do stuff with req, want access to inputs and output
}
【问题讨论】:
-
您可以将 callable 传递给正在执行的线程,该线程会将消息放入队列中。
-
std::async对Callable对象进行操作。例如,您可以在创建该对象时为其分配一个 ID 号,并将该 ID 与std::future对象一起存储在列表中。然后Callable可以将其 ID 发布到消息队列,消息处理程序可以在列表中查找 ID。另一种选择是首先将一个空的std::future添加到列表中,然后将该对象的迭代器传递给Callable,以便它可以将其发送回消息队列。将std::async的结果移动到现有的std::future对象,并让消息处理程序使用发布的迭代器 -
你可能想看看例如HPX 库 (stellar-group.org/category/hpx)。标准库目前没有针对这些问题的优雅解决方案。特别是,HPX 通过
then()为期货提供延续,并通过when_any()/wait_any()等待一系列期货中的任何一个。
标签: c++ asynchronous future