c++ - 使用 std::async 从线程调用函数?

标签 c++ multithreading c++11 asynchronous

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

  1. 是否有政策让它等待条件语句发生?据我了解this post , 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 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();
    }
}

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

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

关于c++ - 使用 std::async 从线程调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24236956/

相关文章:

c++ - 通过选择部分或全部字符生成所有排列的算法

c++ - DirectX 后处理着色器

c++ - 无法使用 GLFW 设置 GL 标志

iphone - Grand Central Dispatch (GCD) 与 performSelector - 需要更好的解释

java - java中如何多个线程使用同一个连接写入数据库?

c++ - 防止 Hook dll加载

java - 在线程中迭代结果集会导致异常。使用 JDBC 连接对 Hive 进行查询的结果集

c++ - constexpr 函数返回字符串文字

C++ std::sort 实现

c++ - 递归折叠参数包以解析占位符类型