一: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. HTML5和CSS3实例教程 中文版 高清PDF扫描版

    HTML5和CSS3实例教程共分3部分,集中讨论了HTML5和CSS3规范及其技术的使用方法.首先是规范概述,介绍了新的结构化标签.表单域及其功能(包括自动聚焦功能和占位文本)和CSS3的新选择器.接 ...

  2. android studio中使用recyclerview小白篇(四)

    经过努力,我们的recyclerview终于可以使用了,但是装配上真实的数据后,发现左边的内容太长了,如果超过一行,左边内容和右边的内容竟然重叠在一起了,好是让人心塞啊,如下图 后来发现设置左边tex ...

  3. [Violet]樱花

    题目链接 洛谷 狗粮版 前置技能 初中基础的因式分解 线性筛 \(O(nlog)\)的分解质因数 唯一分解定理 题解 首先来分解一下式子 \[\frac{1}{x}+\frac{1}{y}=\frac ...

  4. curl下载目录

    http://ftp.loongnix.org/os/loongnix/1.0/SRPMS/ wget wget -c -r -np -k -L -p

  5. 1235: 入学考试[DP]

    1235: 入学考试 [DP] 时间限制: 1 Sec 内存限制: 128 MB 提交: 37 解决: 12 统计 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近 ...

  6. c++多线程基础4(条件变量)

    条件变量是允许多个线程相互交流的同步原语.它允许一定量的线程等待(可以定时)另一线程的提醒,然后再继续.条件变量始终关联到一个互斥 定义于头文件 <condition_variable> ...

  7. 洛谷P1550 [USACO08OCT]打井Watering Hole

    P1550 [USACO08OCT]打井Watering Hole 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to ...

  8. HTTP上下文表单内容转为实体对象

    using ServiceStack.Web; using System; using System.Collections.Generic; using System.Linq; using Sys ...

  9. AForge.net 录像拍照功能实现 转

    AForge.net 使用之录像拍照功能实现 最近使用aforge.NET拍照录像功能实现 记录一下以便以后好学习,哈哈,直接上代码 连接摄像头设备,这里需要引入 AForge.Video; AFor ...

  10. jQuery.isEmptyObject() 函数详解 转

    原文地址 http://www.365mini.com/page/jquery_isemptyobject.htm jQuery.isEmptyObject()函数用于判断指定参数是否是一个空对象. ...