使用std::async从线程调用函数

Using std::async for function call from thread?

本文关键字:调用 函数 线程 async std 使用      更新时间:2023-10-16

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

  1. 是否有策略使其等待条件语句发生?根据我从这篇文章中了解到的wait_forwait_until函数有很多种,但是我发现它们都包含一个时间函数,这些可以适当修改吗?

  2. 会在async函数结束时自动调用析构函数吗?

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

当您调用std::async时,您向它传递要调用的函数的地址(以及您想要传递给该函数的任何参数)。

然后创建一个线程来异步执行该函数。它返回一个future,父线程可以使用它从子线程获取结果。典型的用法是这样的:

#include <string>
#include <future>
#include <iostream>
#include <chrono>
std::chrono::seconds sec(1);
int process() {
    std::cerr << "Doing something slown";
    std::this_thread::sleep_for(sec);
    std::cerr << "donen";
    return 1;
}
int main(int argc, char **argv) {
    if (argc > 1) {
        auto func = std::async(process);
        std::cerr << "doing something else that takes a whilen";
        std::this_thread::sleep_for(sec);
        func.get();
    }
}

注意,我们只需要在返回的future上使用.get来同步线程。sleep_for只是模拟每个线程做一些至少需要一段时间的事情——如果它们完成得太快,它们就没有机会真正并行执行,因为第一个运行的线程可能在第二个线程有机会开始运行之前完成并退出。

如果你想创建显式线程(即,创建std::thread的实例),那就是你最终使用std::wait_for之类的(或者可以最终使用它们,无论如何)。使用期货(即你用std::async创建的),你只需要使用.get等待线程完成并检索线程函数返回的任何内容。