使用std :: async从线程进行函数调用?

时间:2014-06-16 05:09:39

标签: c++ multithreading c++11 asynchronous

我正在运行两个并行线程。其中一个线程需要在满足条件语句时调用异步函数。我发现std::async使用启动策略执行异步函数调用,但我有一些关于它们的问题。

  1. 是否有政策让它等待条件陈述发生?根据我在this post中所理解的,有wait_forwait_until函数,但我发现它们具有时间函数,可以对它们进行适当的修改吗? / p>

  2. 异步函数结束时是否会自动析构函数调用?

  3. 函数调用是否会以任何方式影响父线程的运行?

1 个答案:

答案 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等待线程完成并检索线程函数返回的内容。

相关问题