一:async

std::async:用于创建异步任务,可以代替创建线程,函数原型:
async(std::launch::async | std::launch::deferred, f, args...),第一个参数是创建策略
std::launch::async:立即创建线程
std::launch::deferred:延迟加载方式创建,知道调用future的get或者wait时才创建线程

 int fun4()
{
cout << "thread id :" << this_thread::get_id() << endl;
std::this_thread::sleep_for(std::chrono::seconds());
return ;
} std::async(fun4);

二:future

std::future:提供了一种访问异步操作结果机制,从异步任务中获取结果。

获取future结果:
1.future.get(),等待异步执行结束获取返回结果,只能调用一次
2.future.wait(),等待异步执行完成,无返回值。
3.future.wait_for(),超时等待返回结果,返回std::future_status状态

future_status有三种状态:
1.deferred:异步等待状态
2.ready: 异步已完成状态
3.timeout: 异步超时状态

     std::future_status status = future.wait_for(std::chrono::seconds());
if (status == std::future_status::ready)
{
std::cout << "task is ready" << endl;
}
else if(status == std::future_status::timeout)
{
std::cout << "task is timeout" << endl;
}
else if (status == std::future_status::deferred)
{
std::cout << "task is deferred" << endl;
}

三:packaged_task

packaged_task可以包装一个可调用的对象,可以通过异步获取调用对象的结果,返回结果传递给关联的std::future对象。

 int fun1(int a)
{
std::this_thread::sleep_for(std::chrono::seconds());
return *a;
} int main()
{
//声明一个packaged_task对象
std::packaged_task<int(int)> pt1(fun1);
//packaged_task与future关联
std::future<int> fut1 = pt1.get_future(); //创建一线程,把pt1值传入运行
thread t1(std::move(pt1), ); //阻塞获取执行结果
cout << fut1.get() << endl; //注意只能get获取一次 return ;
}

四:promise

promise可以保存一个值,并可以通过future来读取,比如一个线程把值放入promise中,另一个线程可以通过get_future来获取future,再进行get获取该值。是一种线程同步的手段。

#include <iostream>
#include <thread>
#include <mutex>
#include <future> //声明一个promise对象,用于存放整形值
std::promise<int> prom; int fun1()
{
std::this_thread::sleep_for(std::chrono::seconds());
prom.set_value();
return ;
} void fun2(std::future<int> &fut)
{
cout << "线程1的值:" << fut.get() << endl;
return ;
} int main()
{
thread t1(fun1);
t1.join(); //promise与future关联
std::future<int> fut = prom.get_future();
//引用传递future
thread t2(fun2, std::ref(fut));
t2.join();
return ;
}

扫码关注公众号

专注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。

C++11并发编程:async,future,packaged_task,promise的更多相关文章

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

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

  2. 并发编程(三)Promise, Future 和 Callback

    并发编程(三)Promise, Future 和 Callback 异步操作的有两个经典接口:Future 和 Promise,其中的 Future 表示一个可能还没有实际完成的异步任务的结果,针对这 ...

  3. 【并发编程】Future模式添加Callback及Promise 模式

    Future Future是Java5增加的类,它用来描述一个异步计算的结果.你可以使用 isDone 方法检查计算是否完成,或者使用 get 方法阻塞住调用线程,直到计算完成返回结果.你也可以使用  ...

  4. C++11 并发编程库

    C++11 并发编程 C++11 新标准中引入了几个头文件来支持多线程编程,他们分别是: <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_f ...

  5. C++11 并发指南四(<future> 详解三 std::future & std::shared_future)

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

  6. C++11 并发指南四(<future> 详解三 std::future & std::shared_future)(转)

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

  7. Java 并发编程——Callable+Future+FutureTask

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  8. C++11 并发指南四(<future> 详解一 std::promise 介绍)

    前面两讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread 和 std::m ...

  9. C++11 并发指南四(<future> 详解一 std::promise 介绍)(转)

    前面两讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread 和 std::m ...

  10. C++11 并发编程基础(一):并发、并行与C++多线程

    正文 C++11标准在标准库中为多线程提供了组件,这意味着使用C++编写与平台无关的多线程程序成为可能,而C++程序的可移植性也得到了有力的保证.另外,并发编程可提高应用的性能,这对对性能锱铢必较的C ...

随机推荐

  1. samba服务器共享开发【windows下开发linux网站】

    //@author:yuan<turing_zhy@163.com> //@date:2018-08-05 //注:码字不易转载请注明出处 //环境准备:ubuntu1~16.04.4 1 ...

  2. 国外物联网平台(6):Electric Imp

    国外物联网平台(6)——Electric Imp 马智 公司背景 Electric Imp成立于2011年,公司设立在美国加利福尼亚州洛斯阿尔托斯和英国剑桥 公司投资者包括:富士康技术集团.PTI创投 ...

  3. VSCode调试设置

    tasks.json { "version": "0.1.0", "isShellCommand": true, "args&qu ...

  4. ftp操作方法整理

    1.整理简化了下C#的ftp操作,方便使用    1.支持创建多级目录    2.批量删除    3.整个目录上传    4.整个目录删除    5.整个目录下载 2.调用方法展示, var ftp ...

  5. 分别实现数组所有元素相加、相乘、相与——FP 风格

    var ops = { "plus": (x,y)=>x+y, "mul" : (x,y)=>x*y, "and" : (x,y ...

  6. linux命令笔记,零散记录<不完整,学习用>

    uname -a 输出系统架构 cp 源文件 目标文件 mv同理 tar –xvf file.tar // 解压 tar包 tar -zxvf file.tar.gz // 解压tar.gz tar ...

  7. EF进阶篇(一)——概述

    前言 以前在ITOO里面和图书馆项目开发的时候,采用的这个技术,但是总是对上下文那里不是特别清楚.上下文这个概念很是模糊,所以这次再次拿起这个技术点儿,然后复习了一遍,发现我以前想的好简单. 内容 E ...

  8. 将php命令加入cenos环境变量

    0.修改/etc/profile文件使其永久性生效,并对所有系统用户生效,在文件末尾加上如下两行代码 1.PATH=$PATH:/usr/local/webserver/php/bin:/usr/lo ...

  9. Github 三种克隆模式

    1.我称为平常模式,用于项目的本地克隆使用.(无权限.无加密.ssh protocol) git clone http://github.com/username/exampleproject 2.我 ...

  10. mysql主从复制简单配置,满满的干货

    mysql主从备份(复制)的基本原理 mysql支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.mysql复制基于主服务器在二进制日志中跟踪所有对数据库的更改 ...