我正在运行两个并行线程。其中一个线程需要在满足条件语句时调用异步函数。我发现std::async
使用启动策略执行异步函数调用,但我有一些关于它们的问题。
是否有政策让它等待条件陈述发生?根据我在this post中所理解的,有wait_for
和wait_until
函数,但我发现它们具有时间函数,可以对它们进行适当的修改吗? / p>
异步函数结束时是否会自动析构函数调用?
函数调用是否会以任何方式影响父线程的运行?
答案 0 :(得分:2)
当你调用std::async
时,你传递一个要调用的函数的地址(以及你要传递给该函数的任何参数)。
然后创建一个线程来异步执行该函数。它返回future
,父线程可以使用它来获取子进程的结果。典型用法是这样的:
#include <string>
#include <future>
#include <iostream>
#include <chrono>
std::chrono::seconds sec(1);
int process() {
std::cerr << "Doing something slow\n";
std::this_thread::sleep_for(sec);
std::cerr << "done\n";
return 1;
}
int main(int argc, char **argv) {
if (argc > 1) {
auto func = std::async(process);
std::cerr << "doing something else that takes a while\n";
std::this_thread::sleep_for(sec);
func.get();
}
}
请注意,我们只需在返回的未来使用.get
来同步线程。 sleep_for
只是为了模拟每个线程做一些至少需要一段时间的事情 - 如果它们完成得太快,它们就没有机会真正并行执行,因为第一个运行可以完成并且在第二次有机会开始跑步之前退出。
如果你想创建显式线程(即创建std::thread
的实例),那么当你最终使用std::wait_for
这样的时候(或可以最终使用它们) ,无论如何)。使用期货(即您使用std::async
创建的内容),您只需使用.get
等待线程完成并检索线程函数返回的内容。