当前位置: 首页 > news >正文

std::packagedtask概念和使用方法

一、概念

std::packaged_task是 C++ 标准库中的一个类模板,它将一个可调用对象(如函数、函数对象或 lambda 表达式)包装起来,使得这个可调用对象可以作为异步任务来执行,并可以通过std::future对象获取其结果。

std::packaged_task的主要目的是将任务的执行与结果的获取分离,方便在多线程环境中进行异步编程。

二、使用方法

1. 包含头文件

#include <iostream>
#include <future>

2. 基本用法

   int add(int a, int b) {return a + b;}int main() {// 创建一个 packaged_task 对象,包装 add 函数std::packaged_task<int(int, int)> task(add);// 获取与 packaged_task 关联的 future 对象std::future<int> result = task.get_future();// 在另一个线程中执行任务std::thread t(std::move(task), 3, 4);// 获取任务结果int sum = result.get();std::cout << "The sum is: " << sum << std::endl;t.join();return 0;}

在这个例子中,首先创建了一个std::packaged_task<int(int, int)>对象,将add函数包装起来。然后通过task.get_future()获取与这个任务关联的std::future<int>对象。接着在一个新线程中执行任务,通过std::move(task)将任务转移到新线程中执行。最后,调用result.get()获取任务的结果。

3. 使用 lambda 表达式

   int main() {std::packaged_task<int()> task([](){ return 5 + 3; });std::future<int> result = task.get_future();std::thread t(std::move(task));int sum = result.get();std::cout << "The sum is: " << sum << std::endl;t.join();return 0;}

这里使用 lambda 表达式创建了一个简单的加法任务,并通过std::packaged_taskstd::future来获取结果。

4. 异常处理

如果包装的可调用对象抛出异常,这个异常将在调用std::future对象的get成员函数时重新抛出。

   int divide(int a, int b) {if (b == 0) {throw std::runtime_error("Division by zero");}return a / b;}int main() {std::packaged_task<int(int, int)> task(divide);std::future<int> result = task.get_future();std::thread t(std::move(task), 10, 0);try {int quotient = result.get();std::cout << "The quotient is: " << quotient << std::endl;} catch (const std::exception& e) {std::cout << "Caught an exception: " << e.what() << std::endl;}t.join();return 0;}

std::packaged_task在异步编程中非常有用,可以方便地将任务封装起来并获取其结果,同时可以与std::threadstd::async等结合使用,提高程序的并发性和性能。


http://www.mrgr.cn/news/46597.html

相关文章:

  • 【面试题】技术场景 5、日志采集ELK
  • 32单片机从入门到精通之安全性与可靠性——防护措施(十八)
  • 分布式ID—雪花算法
  • 【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)
  • Leetcode 221. 最大正方形 动态规划
  • 【C语言系列】函数递归
  • JUC高并发编程8:读写锁
  • 算法:双指针系列(一)
  • 车载SerDes历史和发展概述
  • 【C++】面向对象之继承
  • 图的最短路径算法
  • llama3 implemented from scratch 笔记
  • 解决触摸屏屏幕乱动的问题:E: 无法定位软件包 libinput
  • k8s的pod的管理
  • Python基础之List列表用法
  • 有趣的队列
  • 云服务器使用
  • LSTM 长短期记忆网络:解锁时间序列数据的深层秘密
  • 很复杂的UI交互操作系统
  • W外链平台有什么优势?
  • 《Programming from the Ground Up》阅读笔记:p181-p216
  • 基于LORA的一主多从监测系统_0.96OLED
  • CentOS快速配置网络Docker快速部署
  • 希沃冰点还原
  • python发包
  • Javascript 普通非async函数调用async函数