1、std::packaged_task介绍

类模板 std::packaged_task 包装任何可调用 (Callable) 目标(函数、 lambda 表达式、 bind 表达式或其他函数对象),使得能异步调用它。其返回值或所抛异常被存储于能通过 std::future 对象访问的共享状态中。—摘抄自https://www.apiref.com/cpp-zh/cpp/thread/packaged_task.html

接下来看下std::packaged_task的定义:

  /// packaged_tasktemplate<typename _Res, typename... _ArgTypes>class packaged_task<_Res(_ArgTypes...)>{typedef __future_base::_Task_state_base<_Res(_ArgTypes...)> _State_type;shared_ptr<_State_type>                   _M_state;public:// Construction and destructionpackaged_task() noexcept { }// _GLIBCXX_RESOLVE_LIB_DEFECTS// 2095.  missing constructors needed for uses-allocator constructiontemplate<typename _Allocator>packaged_task(allocator_arg_t, const _Allocator& __a) noexcept{ }template<typename _Fn, typename = typename__constrain_pkgdtask<packaged_task, _Fn>::__type>explicitpackaged_task(_Fn&& __fn): packaged_task(allocator_arg, std::allocator<int>(),std::forward<_Fn>(__fn)){ }// _GLIBCXX_RESOLVE_LIB_DEFECTS// 2097.  packaged_task constructors should be constrainedtemplate<typename _Fn, typename _Alloc, typename = typename__constrain_pkgdtask<packaged_task, _Fn>::__type>explicitpackaged_task(allocator_arg_t, const _Alloc& __a, _Fn&& __fn): _M_state(__create_task_state<_Res(_ArgTypes...)>(std::forward<_Fn>(__fn), __a)){ }~packaged_task(){if (static_cast<bool>(_M_state) && !_M_state.unique())_M_state->_M_break_promise(std::move(_M_state->_M_result));}// No copypackaged_task(const packaged_task&) = delete;packaged_task& operator=(const packaged_task&) = delete;template<typename _Allocator>packaged_task(allocator_arg_t, const _Allocator&,const packaged_task&) = delete;// Move supportpackaged_task(packaged_task&& __other) noexcept{ this->swap(__other); }template<typename _Allocator>packaged_task(allocator_arg_t, const _Allocator&,packaged_task&& __other) noexcept{ this->swap(__other); }packaged_task& operator=(packaged_task&& __other) noexcept{packaged_task(std::move(__other)).swap(*this);return *this;}voidswap(packaged_task& __other) noexcept{ _M_state.swap(__other._M_state); }boolvalid() const noexcept{ return static_cast<bool>(_M_state); }// Result retrievalfuture<_Res>get_future(){ return future<_Res>(_M_state); }// Executionvoidoperator()(_ArgTypes... __args){__future_base::_State_base::_S_check(_M_state);_M_state->_M_run(std::forward<_ArgTypes>(__args)...);}voidmake_ready_at_thread_exit(_ArgTypes... __args){__future_base::_State_base::_S_check(_M_state);_M_state->_M_run_delayed(std::forward<_ArgTypes>(__args)..., _M_state);}voidreset(){__future_base::_State_base::_S_check(_M_state);packaged_task __tmp;__tmp._M_state = _M_state;_M_state = _M_state->_M_reset();}};

2、std::packaged_task重要的函数介绍

void swap(packaged_task& __other);//两个packaged task互换
bool valid();//如果有一个新的shared state就产生true。
// Result retrieval
future<_Res> get_future();//获得一个future 对象,可以用来取的shared state
// Execution
void operator()(_ArgTypes... __args);
void make_ready_at_thread_exit(_ArgTypes... __args);
//调用task并且在线成退出时使shared state为ready
void reset(); //建立一个新的shared state,会使shared state为ready
/// swap
template<typename _Res, typename... _ArgTypes>swap(packaged_task<_Res(_ArgTypes...)>& __x, packaged_task<_Res(_ArgTypes...)>& __y);

3、std::packaged_task用法示例

具体示例代码如下:

/*************************************************************************> File Name: thread_packaged_task.cpp> Author: 小和尚敲木鱼> Mail:  > Created Time: Tue 21 Sep 2021 02:40:24 AM PDT************************************************************************/#include <iostream>
#include <thread>
#include <string>
#include <vector>
#include <list>
#include <mutex>
#include <future>
#include <chrono>using namespace std;
/*****************************文件说明***********************************/
int function_1(int param)//线程
{int ret = 10;std::cout << __func__ << "param =" << param  << std::endl;std::cout << "handle thread id ="<< std::this_thread::get_id() << std::endl;std::chrono::milliseconds sleep_time(500);std::this_thread::sleep_for(sleep_time);std::cout << __func__ << " thread id ="<< std::this_thread::get_id() << std::endl;std::cout << __func__ << " return = "<< ret + param << std::endl;return (ret + param);
}int main(int agc,char * agv[])
{int temp = 20;std::cout << "Main thread id =" << std::this_thread::get_id() << std::endl;std::packaged_task<int(int)> handle_task(function_1);//创建packaged_taskstd::thread thread_test(std::ref(handle_task),temp);std::future<int> result = handle_task.get_future();std::cout << "###################" << std::endl;std::cout << "result = " << result.get() << std::endl;if (thread_test.joinable())thread_test.join();return 0;
}
//OUT
//Main thread id =140609886185280
//###################
//function_1param =20
//handle thread id =140609868805888
//function_1 thread id =140609868805888
//function_1 return = 30
//result = 30
/**************************end of file**********************************/

4、总结

std::packaged_task简单来说就是,打包一个异步任务去完成,完成打包后就不用管了,到合适的地点去获取相应的执行结果就可以了。非常的银杏。
Todo:
后续补充其他细节。

C++并发编程之线程异步std::packaged_task知识点总结相关推荐

  1. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...

  2. c++并发编程(concurrency)----线程管理

    c++并发编程(concurrency)----线程管理 启动线程,指定线程运行函数的多种方法 等待线程执行完毕 唯一辨别线程的方法 如果已经有兴趣启动多线程程序了,那么问自己个问题,如何启动多线程? ...

  3. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  4. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

  5. (转)Java并发编程:线程池的使用

    背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...

  6. 并发编程-13线程安全策略之两种类型的同步容器

    文章目录 脑图 概述 同步容器 集合接口下的同步容器实现类 Vector (线程安全性比ArrayList好一些,但并非绝对线程安全) 同步容器 线程不安全的场景 其他注意事项 Hashtable C ...

  7. 并发编程-12线程安全策略之常见的线程不安全类

    文章目录 脑图 概述 字符串拼接子之StringBuilder.StringBuffer StringBuilder (线程不安全) StringBuffer (线程安全) 小结 时间相关的类 Sim ...

  8. 并发编程-11线程安全策略之线程封闭

    文章目录 脑图 概述 线程封闭的三种方式 示例 堆栈封闭 ThreadLocal Step1. ThreadLocal操作类 Step2. 自定义过滤器 Step3. 注册拦截器,配置拦截规则 Ste ...

  9. 并发编程-06线程安全性之可见性 (synchronized + volatile)

    文章目录 线程安全性文章索引 脑图 可见性定义 导致不可见的原因 可见性 -synchronized (既保证原子性又保证可见性) 可见性 - volatile(但不保证操作的原子性) volatil ...

最新文章

  1. [codevs 1922] 骑士共存问题
  2. ActionContext.getContext()的用法总结
  3. 【mark】linux 终端命令行下的快捷键(自己已验证所有)
  4. Elasticsearch环境搭建和介绍(Windows)
  5. 前端学习(3313):redux的基本操作
  6. 迁移潮来袭!数十个项目宣布即将停止支持 Python 2
  7. matlab2c使用c++实现matlab函数系列教程-exppdf函数
  8. 以软件开发周期来说明不同的测试的使用情况
  9. opencv计算机视觉学习笔记一
  10. PostgreSQL查询优化器详解之逻辑优化篇
  11. 什么是外汇EA?外汇EA有什么风险?
  12. html文件设置成mac屏保,如何将视频设置为Mac上的屏幕保护程序 | MOS86
  13. python discuz论坛帖子_[Scrapy爬虫实战]Discuz论坛版块内全部帖子获取
  14. 服务器终端输出,服务器与终端数据交互程序
  15. 海鲅S1小白装黑果心得体会
  16. matlab 对数计算方法
  17. LR支持M1芯片款mac安装 Lightroom CC20直装版M1安装教程 M1芯片处理器安装LR问题教程
  18. 转:LANMPS 一键PHP环境安装包
  19. 基于递归神经网络的跌倒检测系统
  20. 等保2.0 二级和三级安全设备拓扑图

热门文章

  1. 亚马逊云科技物联网产业创新峰会与你相聚蓉城
  2. spring boot 1.x和 2.x通过代码修改默认address和端口
  3. 5G 时代,AI 如何破竹而出? | AI ProCon
  4. 内网渗透-PTHPTTPTK
  5. 如何保存卡住的wps_wps卡住了怎么强制退出
  6. matlab 生成 gif
  7. 《长安十二时辰》,作为程序员,看完我震惊了!涉及通信、云计算、大数据等!...
  8. Stata:各类集中度指数估算-广义基尼Gini系数
  9. 2021年的保研之旅总结
  10. PHPStorm 常用设置