C++11并发编程:async,future,packaged_task,promise
一: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的更多相关文章
- C++11 并发指南四(<future> 详解二 std::packaged_task 介绍)
上一讲<C++11 并发指南四(<future> 详解一 std::promise 介绍)>主要介绍了 <future> 头文件中的 std::promise 类, ...
- 并发编程(三)Promise, Future 和 Callback
并发编程(三)Promise, Future 和 Callback 异步操作的有两个经典接口:Future 和 Promise,其中的 Future 表示一个可能还没有实际完成的异步任务的结果,针对这 ...
- 【并发编程】Future模式添加Callback及Promise 模式
Future Future是Java5增加的类,它用来描述一个异步计算的结果.你可以使用 isDone 方法检查计算是否完成,或者使用 get 方法阻塞住调用线程,直到计算完成返回结果.你也可以使用 ...
- C++11 并发编程库
C++11 并发编程 C++11 新标准中引入了几个头文件来支持多线程编程,他们分别是: <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_f ...
- C++11 并发指南四(<future> 详解三 std::future & std::shared_future)
上一讲<C++11 并发指南四(<future> 详解二 std::packaged_task 介绍)>主要介绍了 <future> 头文件中的 std::pack ...
- C++11 并发指南四(<future> 详解三 std::future & std::shared_future)(转)
上一讲<C++11 并发指南四(<future> 详解二 std::packaged_task 介绍)>主要介绍了 <future> 头文件中的 std::pack ...
- Java 并发编程——Callable+Future+FutureTask
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- C++11 并发指南四(<future> 详解一 std::promise 介绍)
前面两讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread 和 std::m ...
- C++11 并发指南四(<future> 详解一 std::promise 介绍)(转)
前面两讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread 和 std::m ...
- C++11 并发编程基础(一):并发、并行与C++多线程
正文 C++11标准在标准库中为多线程提供了组件,这意味着使用C++编写与平台无关的多线程程序成为可能,而C++程序的可移植性也得到了有力的保证.另外,并发编程可提高应用的性能,这对对性能锱铢必较的C ...
随机推荐
- Map存储容量及内存占用测试
Integer a = 1; long start = 0; long end = 0; // 先垃圾回收 System.gc(); start = Runtime.getRuntime().free ...
- Transaction And Lock--快照事务隔离级别
--================================================--准备数据GOCREATE DATABASE DB5GOUSE DB5GOCREATE TABLE ...
- wp8 与wp7.5图标规格说明
wp8 小图标 159*159 中图标 336*336 大图标 691*336 wp7.5 173*173
- angular 双向绑定
<input type="text" [(ngModel)]="name"> {{name}} import { Component, OnInit ...
- 「HEOI2016/TJOI2016」序列
题目链接 戳这 Solution 首先考虑最暴力的dp 我们设: \(f[i]\)表示选择\(i\)以后所能形成的满足条件的子序列的最大值 \(minx[i]\)表示\(i\)能转换为的最小值 \(m ...
- git Problem with the SSL CA cert (path? access rights?)
问题: [root@localhost opt]# git clone https://github.com/docker/docker.git 正克隆到 'docker'...fatal: unab ...
- MultiTrigger
MultiTrigger是多条件触发器.意为多个条件同时满足时才会触发. 用法和Trigger差不多. 但是MultiTrigger的条件是在写在自身的判断环境之中. 基本的语法是: <Mult ...
- Mac php7本地安装mongodb扩展以适配使用mongo扩展的线上老代码
从https://pecl.php.net/package/mongodb官网下载压缩包(不懂事的我下载了1.5.1版本) 解压安装包 tar -zxvf mongodb-1.5.1.tgz 进入解压 ...
- { "result": null, "log_id": 304592860300941982, "error_msg": "image check fail", "cached": 0, "error_code": 222203, "timestamp": 1556030094 }
这个是人脸识别时无法检测到图片报的错,有时候我们检测一张图片是否在库里面,当一张图片明显在里面,还检测不到,如下面是我的代码 package Test1; import java.io.IOExcep ...
- hadoop中常用的hdfs代码操作
一:向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件: package hadoopTest; import org.apache.h ...