目录

  • 一 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 起)

三 成员函数

  1. 构造

    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 仅可移动。
  1. 析构

    ~packaged_task();
    
  • 抛弃共享状态并销毁存储的任务对象。
  • 同 std::promise::~promise ,若在令共享状态就绪前抛弃它,则存储以 std::future_errc::broken_promise 为 error_code 的 std::future_error 异常。
  1. operator=

    packaged_task& operator=( const packaged_task& ) = delete; (1)(C++11 起)
    packaged_task& operator=( packaged_task&& rhs ) noexcept; (2)(C++11 起)
    
  • 不可复制赋值
  1. valid

    bool valid() const noexcept; (C++11 起)
    
  • 检查任务对象是否拥有合法函数。
  1. 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相关推荐

  1. c++多线程学习11 packaged_task与async

    一.packaged_task异步调用函数打包 普通的函数一调用立马获取返回值 packaged_task类的主要作用是把一个函数包装成一个对象,通过这个对象的访问的时候在函数的调用和返回值的获取可以 ...

  2. C++多线程std::async、std::future、std::packaged_task、std::promise

    std::async std::async用于创建异步任务,实际上就是创建一个线程执行相应任务,默认立即开始执行. std::async就是异步编程的高级封装,std::async的操作,其实相当于封 ...

  3. C++11中std::packaged_task的使用

    C++11中的std::packaged_task是个模板类.std::packaged_task包装任何可调用目标(函数.lambda表达式.bind表达式.函数对象)以便它可以被异步调用.它的返回 ...

  4. c++11多线程之packaged_task<>介绍与实例

    本节讨论c++11中std::packaged_task的特性与使用方法 std::packaged_task<> std::packaged_task<>是一个类模板,代表一 ...

  5. C++11 并发指南四(future 详解二 std::packaged_task 介绍)

    上一讲<C++11 并发指南四(<future> 详解一 std::promise 介绍)>主要介绍了 <future> 头文件中的 std::promise 类, ...

  6. c++11多线程编程(十):packaged_task介绍与实例

    本节讨论c++11中std::packaged_task的特性与使用方法 std::packaged_task<> std::packaged_task<>是一个类模板,代表一 ...

  7. c++ 11 多线程支持 (std::packaged_task)

    定义于头文件 <future> template< class > class packaged_task; // 不定义 (1) (C++11 起) template< ...

  8. C语言中task的用法,C++11中std::packaged_task的使用详解

    C++11中的std::packaged_task是个模板类.std::packaged_task包装任何可调用目标(函数.lambda表达式.bind表达式.函数对象)以便它可以被异步调用.它的返回 ...

  9. C++11多线程之 std::packaged_task

    简介 先给出官网的一个地址:http://www.cplusplus.com/reference/future/packaged_task/?kw=packaged_task 个人认为,相当于一个装饰 ...

最新文章

  1. python 判断字符串是否全部为数字组成(使用isdigit)
  2. SQL-Hive中的Select From解析
  3. python把图片另存为_pycharm sciview的图片另存为操作
  4. 超简单的MySQL菜鸟安装教程
  5. openresty开发系列11--openresty的api入门
  6. Linux下c的进一步学习
  7. CCIE理论-第十篇-IPV6 VS IPV4(带你们看看U.S.A的ISP的设备)
  8. Angular Web App部署Ubuntu Nginx
  9. Oracle数据恢复、数据库恢复、灾难恢复专题
  10. samba服务器查看文件共享,我的笔记Uuntu下Samba服务器共享文件夹在windows7 下查看.doc...
  11. 阿里DNS:用LibFuzzer照亮DNS代码的死角
  12. 数据:Uniswap V3的24小时交易量已超过2亿美元
  13. 一个老鸟眼中“IT民工”的发展方向
  14. 到底该如何理解 Unix/Linux 的文件系统?看这篇就知道了
  15. (转载)数据库的三范式:我见过讲的最通俗易懂的三范式!!!
  16. 错误java.lang.NoClassDefFoundError: org/jaxen/VariableContext
  17. 宽带拨号连接失败,代码651
  18. 博客披着个人外衣的集体游戏
  19. 第十三章:Sqlserver2019数据库之Transact-SQL 语法基础及常用 SQL 函数总结
  20. 如何在VC中加减日期及 CTime COleDateTime的常用操作和比较

热门文章

  1. 信数金服:物联网案例之物联网系统如何进行实时决策
  2. java jnlp 签名_JNLP(jar包签名)
  3. 【日语】编程相关日语词汇
  4. react中使用微信jssdk分享总结
  5. Error:scalac: Scala compiler JARs not found
  6. 敏捷学习~backlog
  7. slqdbx mysql_sqldbx下载 v4.3 附sqldbx使用教程
  8. grpc-go 连接backoff协议
  9. 登录mysql报错Failed to connect to backoff 或 Failed to get D-Bus connection: Operation not permitted解决方法
  10. 大写汉字(大写汉字又称什么数码)