欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > C++中,std::async 一个用于异步编程的工具

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

2025/9/23 23:37:08 来源:https://blog.csdn.net/weixin_55491446/article/details/148773840  浏览:    关键词: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 块来捕获异常。

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词