C++中,std::async 一个用于异步编程的工具

在C++中,std::async 是一个用于异步编程的工具,它允许你在一个单独的线程中执行任务,并返回一个 std::future 对象,通过这个对象可以获取任务的结果或者检查任务的状态。

基本用法1

lambda 表达式

复制代码
#include <iostream>
#include <future>
#include <chrono>

int main() {
    // 使用 std::async 创建一个异步任务
    auto future_result = std::async(std::launch::async, []{
        std::cout << "Task is running in a separate thread." << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(2));
        return 42;  // 返回值
    });

    // 主线程继续执行其他操作
    std::cout << "Main thread continues to execute." << std::endl;

    // 等待异步任务完成并获取结果
    int result = future_result.get();
    std::cout << "Result from async task: " << result << std::endl;

    return 0;
}

解释

  • std::launch::async: 强制任务在独立的线程中运行。
  • std::launch::deferred: 延迟执行任务,直到调用 future::get()future::wait()
  • std::launch::async | std::launch::deferred: 允许实现选择如何执行任务(默认行为)。

基本用法2

基本函数及传入函数值

复制代码
#include <iostream>
#include <future>
#include <chrono>

// 定义一个简单的异步函数
int calculate(int x) {
    std::this_thread::sleep_for(std::chrono::seconds(2));  // 模拟耗时操作
    return x * x;  // 返回平方值
}

int main() {
    // 使用 std::async 启动异步任务
    auto future_result = std::async(std::launch::async, calculate, 5);

    // 主线程继续执行其他操作
    std::cout << "Main thread continues to execute." << std::endl;

    // 等待异步任务完成并获取结果
    try {
        int result = future_result.get();  // 获取异步任务的返回值
        std::cout << "Result from async task: " << result << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }

    return 0;
}

输出示例

复制代码
Main thread continues to execute.
Task is running in a separate thread.
Result from async task: 25

解释

  1. 异步函数定义 : calculate 是一个普通的函数,接受一个整数参数并返回其平方值。
  2. 启动异步任务 : 使用 std::async 启动异步任务,传入 calculate 函数及其参数 5
  3. 主线程继续执行: 在等待异步任务完成的同时,主线程可以继续执行其他操作。
  4. 获取结果 : 使用 future_result.get() 等待异步任务完成并获取返回值。

特点

  1. 线程管理 : std::async 自动管理线程生命周期,简化了多线程编程。
  2. 结果获取 : 可以通过 std::future 获取异步任务的结果。
  3. 异常处理 : 如果异步任务抛出异常,可以通过 std::futureget() 方法捕获。

注意事项

  • std::async 并不保证一定创建新线程,具体行为取决于实现和参数设置。

  • 使用 std::futureget() 方法可能会阻塞当前线程,直到异步任务完成。

  • 异常处理 : 如果异步任务抛出异常,future::get() 会重新抛出该异常,因此建议使用 try-catch 块来捕获异常。

  • 线程安全: 如果多个线程访问共享资源,确保采取适当的同步措施。

相关推荐
艾斯比的日常2 分钟前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
2501_9411444212 分钟前
Python + C++ 异构微服务设计与优化
c++·python·微服务
T***u33316 分钟前
JavaScript在Node.js中的流处理大
开发语言·javascript·node.js
程序猿编码17 分钟前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince
未来之窗软件服务31 分钟前
幽冥大陆(三十四)VUE +node智慧农业电子秤读取——东方仙盟炼气期
开发语言·vue·电子秤·东方仙盟·东方仙盟sdk
CoderYanger1 小时前
优选算法-字符串:63.二进制求和
java·开发语言·算法·leetcode·职场和发展·1024程序员节
3***31211 小时前
java进阶1——JVM
java·开发语言·jvm
charlie1145141911 小时前
深入理解C/C++的编译链接技术6——A2:动态库设计基础之ABI设计接口
c语言·开发语言·c++·学习·动态库·函数
Cx330❀1 小时前
C++ STL set 完全指南:从基础用法到实战技巧
开发语言·数据结构·c++·算法·leetcode·面试
white-persist1 小时前
【攻防世界】reverse | Reversing-x64Elf-100 详细题解 WP
c语言·开发语言·网络·python·学习·安全·php