c++ 11 中future的一些理解

c++ 11 中 异步编程提供了很多新接口,大大简化了学习和使用成本,但是对应的,也引入了更多的基础概念。仔细理解这些概念,以及他们使用的场景,api中各个参数的含义,对于正确使用接口至关重要。

1. std::future

1.1 wait

1.2 wait_for

1.3 get

2. std::promise

3. std::packaged_task

4. std::async

5. 他们之间的关系可以用几句话简单的描述为:

5.0 官方的描述中,std::future std::promise 和 std::packaged_task 是 provider;

5.1 std::promise 封装了包含了 std::future 的异步操作结果;

5.2 std::packaged_task 封装了包含了 std::future 的异步操作对象;

5.3 通过 std::future 可以获取异步操作的真正结果;

5.4 通过 std::async 是对 std::promise 和 std::packaged_task 的高级封装以简化使用,第一个参数 std::launch::policy 有两种类型,这个参数指明使用thread来触发,还是延迟到wait或者get调用时才触发执行;

6. 应用代码

6.1 使用future来实现优雅退出线程

 1 #include <iostream>
 2 #include <thread>
 3 #include <future>
 4 #include <chrono>
 5
 6 std::promise<int> pro;
 7 std::future<int> f = pro.get_future();
 8
 9 void do_stuff()
10 {
11     while (f.wait_for(std::chrono::milliseconds(1000)) == std::future_status::timeout)
12     // while (f.wait_for(std::chrono::milliseconds(1)) == std::future_status::timeout)
13     {
14         // std::this_thread::sleep_for(std::chrono::milliseconds(1000));
15         std::cout << "do stuff ing..." << std::endl;
16     }
17     std::cout << "do stuff done" << std::endl;
18 }
19
20
21 int main()
22 {
23     std::thread t(do_stuff);
24     std::this_thread::sleep_for(std::chrono::seconds(10));
25     pro.set_value(9);
26     std::cout << "main done" << std::endl;
27     t.join();
28
29     return 0;
30 }

6.2 promise 和 packaged_task 使用演示

原文地址:https://www.cnblogs.com/warnet/p/12663894.html

时间: 2024-08-29 20:14:05

c++ 11 中future的一些理解的相关文章

C++11中多线程库

一.linux 线程同步 线程是在操作系统层面支持的,所以多线程的学习建议还是先找一本linux系统编程类的书,了解linux提供多线程的API.完全完全使用系统调用编写多线程程序是痛苦,现在也有很多封装好的多线程库,但是了解多线程系统对学习编写多线程程序非常有好处.总的来说linux提供了四类系统用于多程序程序,分别线程的创建.销毁(thread),用于线程同步的(互斥量(mutex).条件量(cond),信号量(sem)). 互斥量通过锁的机制实现线程间的同步.互斥量是一种特殊的变量,可以对

XenApp/XenDesktop 7.11中对于视频、图片、文字的优化的说明

在桌面虚拟化这个技术门类中,市面上一共主流有以下几种协议: Citrix的ICA/HDX协议 Teradici公司的PCoIP(VMware Horzion中主要使用的协议之一) 微软公司的RDP RedHat公司的spice 以及近两年我们能接触到的 VMware公司的Blast(VMware在Horizion 6版本以后开始提供的协议,有逐步替代PCoIP的趋势) 华为的HDP 但是无论怎么墙头变换大王旗,Citrix的ICA/HDX协议可以说多年来一直都是行业最为优秀的企业级远程交付协议.

C++11中智能指针的原理、使用、实现

目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存.使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存. 理解智能指针需要从下面三个层次: 从较浅的层面看,智能指针是利用了一种叫做RAII(资

JavaScript中的伪数组理解

看过jQuery源码的人都知道类数组对象,与我们熟知的arguments对象很像 构造一个类数组必须有两个条件 第一个条件:你必须给对象定义个splice方法,只要他是一个function就可以 第二个条件:就是赋值一个length属性,或者增加push,unshift,shift,pop其中任何一个方法,并且调用了一次. 当这两个条件同时满足那么当前的对象在控制台输出后跟数组的格式一模一样. 一般而言大部分都是这样构造一个类数组对象(jQuery就是这么干的).因为相比而言,这样更简洁,并且更

jquery中的mouseenter实现理解

说在前面:首先说一下两者之间的区别,假设当前元素为element,mouseover事件具有冒泡特性,也就是说无论鼠标是从别的元素移动到element或者是从element的子元素移动到element都会触发mouseover事件.对于mouseenter事件,该事件没有冒泡特性,也就是说只有鼠标穿过该事件的时候才会触发mouseenter,如果鼠标一直在element内部"游走",则不会触发mouseenter.具体的例子可以参考这个例子点击打开链接. 前提说完了,那么怎么使用mou

c++11 中的 move 与 forward

一. move 关于 lvaue 和 rvalue,在 c++11 以前存在一个有趣的现象:T&  指向 lvalue (左传引用), const T& 既可以指向 lvalue 也可以指向 rvalue.但却没有一种引用类型,可以限制为只指向 rvalue.这乍看起来好像也不是很大的问题,但其实不是这样,右值引用的缺失有时严重限制了我们在某些情况下,写出更高效的代码.举个粟子,假设我们有一个类,它包含了一些资源: class holder { public: holder() { res

C++11 中值得关注的几大变化(网摘)

C++11 中值得关注的几大变化(详解) 原文出处:[陈皓 coolshell] 源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里.所以,我就不翻译了,我在这里仅对文中提到的这些变化"追问为什么要引入这些变化"的一个探讨,只有知道为了什么,用在什么地方,我们才能真正学到这个知识.而以此你可以更深入地了解这些变化.所以,本文不是翻译.因为写

C++11中的变量初始化

变量初始化很简单嘛,有什么难的? 打住,不要骄傲,往下看,你会哭的. 请看下面四个问题: 1: 下面的语句有不同吗?不同在哪里? widget w;                   // a widget w();                 // b widget w{};                 // c widget w(x);                // d widget w{x};                // e widget w = x;       

【转】C++ 11 右值引用的理解

右值引用的目的之一,是为了C++中一个比较影响性能的问题:拷贝临时对象,例如,在 1 int foo(){ ... } 2 int x; 3 x = foo(); 中,在第三句中,发生了以下的事情: 1.销毁 x 所持有的资源: 2.拷贝函数 foo 返回的临时对象所持有的资源: 3.销毁 foo 返回的临时对象: 经历了三次的操作,然而实际上,如果直接将 x 指向 foo 所返回的临时对象,调用临时对象的析构函数去销毁 x 之前拥有的资源的话,省略了很多麻烦的步骤,但是由于之前的 C++ 中对