C++11 packaged_task
目录
- 一 packaged_task
- 二 定义
- 三 成员函数
- 四 get_future
- 五 执行函数
- 1. operator()
- 2. make_ready_at_thread_exit
- 3. demo
- 六 reset
- 七 参考
一 packaged_task
- 前文 C++11 async 可知,异步操作的方式之一是:std::async + std::future 。
- 前文 C++11 promise 可知,获取 std::thread 异步执行结果的方法之一是:std::promise + std::future。
- 将任务异步执行 + 结果获取的方法之一则是本文的 std::packaged_task + std::future。
- 类模板 std::packaged_task 包装任何可调用 (Callable) 目标(函数、 lambda 表达式、 bind 表达式或其他函数对象),使得能异步调用它。其返回值或所抛异常被存储于能通过 std::future 对象访问的共享状态中。
二 定义
// 头文件 <future>
template< class > class packaged_task; (1)(C++11 起)
template< class R, class ...Args >
class packaged_task<R(Args...)>; (2)(C++11 起)
三 成员函数
构造
packaged_task() noexcept; (1) (C++11 起) template <class F> explicit packaged_task( F&& f ); (2)(C++11 起) template <class F, class Allocator> explicit packaged_task( std::allocator_arg_t, const Allocator& a, F&& f ); (3)(C++11 起)(C++17 前) packaged_task( const packaged_task& ) = delete; (4)(C++11 起) packaged_task( packaged_task&& rhs ) noexcept; (5)(C++11 起)
- 复制构造函数被删除, std::packaged_task 仅可移动。
析构
~packaged_task();
- 抛弃共享状态并销毁存储的任务对象。
- 同 std::promise::~promise ,若在令共享状态就绪前抛弃它,则存储以 std::future_errc::broken_promise 为 error_code 的 std::future_error 异常。
operator=
packaged_task& operator=( const packaged_task& ) = delete; (1)(C++11 起) packaged_task& operator=( packaged_task&& rhs ) noexcept; (2)(C++11 起)
- 不可复制赋值
valid
bool valid() const noexcept; (C++11 起)
- 检查任务对象是否拥有合法函数。
swap
void swap( packaged_task& other ) noexcept; (C++11 起)
- 交换 两个任务对象的共享状态和存储的任务。
四 get_future
std::future<R> get_future(); (C++11 起)
get_future 对每个 packaged_task 只能调用一次。
五 执行函数
1. operator()
- 设置结果为指定值, 并使状态就绪。
void operator()( ArgTypes... args );(C++11 起)
- 以 args 为参数调用存储的任务。任务返回值或任何抛出的异常被存储于共享状态。令共享状态就绪,并解除阻塞任何等待此操作的线程。
2. make_ready_at_thread_exit
void make_ready_at_thread_exit( ArgTypes... args ); (C++11 起)
- 仅在当前线程退出,并销毁所有线程局域存储期对象后,才令共享状态就绪。
3. demo
#include <cmath>
#include <functional>
#include <future>
#include <iostream>
#include <thread>int f(int x, int y) {return std::pow(x, y);
}void task_lambda() {std::packaged_task<int(int, int)> task([](int a, int b) { return std::pow(a, b); });std::future<int> result = task.get_future();task(2, 9);std::cout << "task_lambda:\t" << result.get() << '\n';
}void task_bind() {std::packaged_task<int()> task(std::bind(f, 2, 11));std::future<int> result = task.get_future();task();std::cout << "task_bind:\t" << result.get() << '\n';
}void task_thread() {std::packaged_task<int(int, int)> task(f);std::future<int> result = task.get_future();std::thread task_td(std::move(task), 2, 10); // thread中执行task_td.join();std::cout << "task_thread:\t" << result.get() << '\n';
}int main() {{std::packaged_task<int(int, int)> task;std::cout << std::boolalpha << task.valid() << std::endl;}task_lambda();task_bind();task_thread();
}
- 结果
false
task_lambda: 512
task_bind: 2048
task_thread: 1024
六 reset
void reset(); (C++11 起)
- 重置状态,抛弃先前执行的结果。构造共享状态。
- demo
std::packaged_task<int(int, int)> task([](int a, int b) { return std::pow(a, b); });
std::future<int> result = task.get_future();
task(2, 9);
std::cout << "2^9 = " << result.get() << '\n';task.reset();
result = task.get_future();
std::thread task_td(std::move(task), 2, 10);
task_td.join();
std::cout << "2^10 = " << result.get() << '\n';
- 结果
2^9 = 512
2^10 = 1024
七 参考
cppreference-packaged_task
C++11 packaged_task相关推荐
- c++多线程学习11 packaged_task与async
一.packaged_task异步调用函数打包 普通的函数一调用立马获取返回值 packaged_task类的主要作用是把一个函数包装成一个对象,通过这个对象的访问的时候在函数的调用和返回值的获取可以 ...
- C++多线程std::async、std::future、std::packaged_task、std::promise
std::async std::async用于创建异步任务,实际上就是创建一个线程执行相应任务,默认立即开始执行. std::async就是异步编程的高级封装,std::async的操作,其实相当于封 ...
- C++11中std::packaged_task的使用
C++11中的std::packaged_task是个模板类.std::packaged_task包装任何可调用目标(函数.lambda表达式.bind表达式.函数对象)以便它可以被异步调用.它的返回 ...
- c++11多线程之packaged_task<>介绍与实例
本节讨论c++11中std::packaged_task的特性与使用方法 std::packaged_task<> std::packaged_task<>是一个类模板,代表一 ...
- C++11 并发指南四(future 详解二 std::packaged_task 介绍)
上一讲<C++11 并发指南四(<future> 详解一 std::promise 介绍)>主要介绍了 <future> 头文件中的 std::promise 类, ...
- c++11多线程编程(十):packaged_task介绍与实例
本节讨论c++11中std::packaged_task的特性与使用方法 std::packaged_task<> std::packaged_task<>是一个类模板,代表一 ...
- c++ 11 多线程支持 (std::packaged_task)
定义于头文件 <future> template< class > class packaged_task; // 不定义 (1) (C++11 起) template< ...
- C语言中task的用法,C++11中std::packaged_task的使用详解
C++11中的std::packaged_task是个模板类.std::packaged_task包装任何可调用目标(函数.lambda表达式.bind表达式.函数对象)以便它可以被异步调用.它的返回 ...
- C++11多线程之 std::packaged_task
简介 先给出官网的一个地址:http://www.cplusplus.com/reference/future/packaged_task/?kw=packaged_task 个人认为,相当于一个装饰 ...
最新文章
- python 判断字符串是否全部为数字组成(使用isdigit)
- SQL-Hive中的Select From解析
- python把图片另存为_pycharm sciview的图片另存为操作
- 超简单的MySQL菜鸟安装教程
- openresty开发系列11--openresty的api入门
- Linux下c的进一步学习
- CCIE理论-第十篇-IPV6 VS IPV4(带你们看看U.S.A的ISP的设备)
- Angular Web App部署Ubuntu Nginx
- Oracle数据恢复、数据库恢复、灾难恢复专题
- samba服务器查看文件共享,我的笔记Uuntu下Samba服务器共享文件夹在windows7 下查看.doc...
- 阿里DNS:用LibFuzzer照亮DNS代码的死角
- 数据:Uniswap V3的24小时交易量已超过2亿美元
- 一个老鸟眼中“IT民工”的发展方向
- 到底该如何理解 Unix/Linux 的文件系统?看这篇就知道了
- (转载)数据库的三范式:我见过讲的最通俗易懂的三范式!!!
- 错误java.lang.NoClassDefFoundError: org/jaxen/VariableContext
- 宽带拨号连接失败,代码651
- 博客披着个人外衣的集体游戏
- 第十三章:Sqlserver2019数据库之Transact-SQL 语法基础及常用 SQL 函数总结
- 如何在VC中加减日期及 CTime COleDateTime的常用操作和比较
热门文章
- 信数金服:物联网案例之物联网系统如何进行实时决策
- java jnlp 签名_JNLP(jar包签名)
- 【日语】编程相关日语词汇
- react中使用微信jssdk分享总结
- Error:scalac: Scala compiler JARs not found
- 敏捷学习~backlog
- slqdbx mysql_sqldbx下载 v4.3 附sqldbx使用教程
- grpc-go 连接backoff协议
- 登录mysql报错Failed to connect to backoff 或 Failed to get D-Bus connection: Operation not permitted解决方法
- 大写汉字(大写汉字又称什么数码)