C++11的future和promise、parkged_task使用

所属分类: 软件编程 / C 语言 阅读数: 132
收藏 0 赞 0 分享

future 的介绍

A future is an object that can retrieve a value from some provider object or function, properly synchronizing this access if in different threads.

它可以从异步的对象或者函数任务中获取结果,它通常和std::async、promise、packaged_task相互调用。

future对象通常是在valid有效的情况下可以使用,默认的构造函数是valid是false的,所以在使用future时,需要对其对象进行初始化。

future的成员函数

成员函数

future用法

future可以从多线程中获取到相关的结果或者是线程输出的结果。因为线程的输出结果不会马上输出(等待执行完成),所以future会有一个共享的状态用于判断当前future的状态。

future输出结果会有三种状态,类型是std::future_status,它们分别是

  • deferred:还没开始;
  • ready:已经完成;
  • timeout:执行超时.

其中future获取结果的方式有这几种:get、wait、wait_for。

1、get等待异步操作结束并返回结果;

2、wait只是等待异步操作完成;

3、wait_for是超时等待返回结果。

 future和async使用的例子

#include <iostream>
#include <future>
#include <unistd.h>

int main(int argc, char **argv) {

  std::future_status f_status;

  auto func = [](int b) -> int{
      std::cout << "async thread running...." << std::endl;
      for (int i = 0; i< b; i++) {
        ;
      }
      return b;
    };
  std::future<int> fut = std::async(std::launch::async, func, 888888888);
  std::cout << "main thread running ...." << std::endl;
  std::chrono::milliseconds span(100);
  //方法一,用于等待异步操作的数据
  while(1) {
    f_status = fut.wait_for(span);
    if (f_status == std::future_status::ready) {
      std::cout << "future_status::ready   ";
      break;
    } else if(f_status == std::future_status::deferred) {
      std::cout << "future_status::deferred ";
    } else if(f_status == std::future_status::timeout) {
      std::cout << "future_status::timeout  ";
    }
    std::cout << std::endl;
    std::cout << "................";
    std::cout << std::endl;
    //fut.wait(); //方法二,等待异步线程的数据
  }
  std::cout << "future result " << fut.get() << std::endl;
  return 0;

编译脚本

cmake_minimum_required(VERSION 2.6)
set(src ./async.cpp)
set(exe "async")
set(CMAKE_CXX_FLAGS -std=c++11)
add_executable(${exe} ${src})
target_link_libraries(${exe} -lpthread)

promise

std::promise为获取线程函数中的某个值提供便利,在线程函数中给外面传进来的promise赋值,当线程函数执行完成之后就可以通过promis获取该值了,值得注意的是取值是间接的通过promise内部提供的future来获取的。

promise 成员函数

成员函数

它的基本用法:

 std::promise<int> pr;
  std::thread t([](std::promise<int>& p){ p.set_value_at_thread_exit(9); },std::ref(pr));
  std::future<int> f = pr.get_future();
  auto r = f.get();

parkaged_task

std::packaged_task

std::packaged_task它包装了一个可调用的目标(如function, lambda expression, bind expression, or another function object),以便异步调用,它和promise在某种程度上有点像,promise保存了一个共享状态的值,而packaged_task保存的是一 个函数。它的基本用法:

 std::packaged_task<int()> task([](){ return 7; });
  std::thread t1(std::ref(task)); 
  std::future<int> f1 = task.get_future(); 
  auto r1 = f1.get();

promise和packaged_task与std::future的关系

std::future提供了一个访问异步操作结果的机制,它和线程是一个级别的属于低层 次的对象,在它之上高一层的是std::packaged_task和std::promise,他们内部都有future以便访问异步操作结 果,std::packaged_task包装的是一个异步操作,而std::promise包装的是一个值,都是为了方便异步操作的,因为有时我需要获 取线程中的某个值,这时就用std::promise,而有时我需要获一个异步操作的返回值,这时就用std::packaged_task,说直白点就是promise获取的是执行过程中设置的值,而packaged_task获取的是结果。

参考部分:

http://www.cplusplus.com/reference/future/future/?kw=future

https://www.cnblogs.com/KunLunSu/p/8051542.html

更多精彩内容其他人还在看

深入解析C++中派生类的构造函数

这篇文章主要介绍了深入解析C++中派生类的构造函数,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

解析C++中多层派生时的构造函数及一些特殊形式

这篇文章主要介绍了解析C++中多层派生时的构造函数及一些特殊形式,特殊形式主要针对基类和子对象类型的构造函数内容,需要的朋友可以参考下
收藏 0 赞 0 分享

简单介绍C++编程中派生类的析构函数

这篇文章主要介绍了C++编程中派生类的析构函数,析构函数平时一般使用较少,需要的朋友可以参考下
收藏 0 赞 0 分享

深入解析C++中类的多重继承

这篇文章主要介绍了深入解析C++中类的多重继承,包括多重继承相关的二义性问题,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C++中基类与派生类的转换以及虚基类

这篇文章主要介绍了详解C++中基类与派生类的转换以及虚基类,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

解析C++编程中的继承方面的运用

这篇文章主要介绍了解析C++编程中的继承方面的运用,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C++编程的多态性概念

这篇文章主要介绍了C++编程的多态性概念,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

c++统计文件中字符个数代码汇总

本文给大家汇总介绍了3种使用C++实现统计文件中的字符个数的方法,非常的简单实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

详解C++编程中的虚函数

这篇文章主要介绍了详解C++编程中的虚函数,包括在什么情况下应当声明虚函数的相关讲解,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言putenv()函数和getenv()函数的使用详解

这篇文章主要介绍了C语言putenv()函数和getenv()函数的使用详解,用来进行环境变量的相关操作,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多