Promise内部会建立一个shared state是用来放一个相应的类型的值或是一个异常,并可被future object 取其数据当线程结果

promise是在形成成果后才将结果放进shared state中。所以不会发生读和写的并发操作

#include <thread>
#include <future>
#include <iostream>
#include <string>
#include <exception>
#include <random>//随机数类
#include <chrono>//时间处理类
#include <stdexcept>//标准异常类
#include <functional>//STL 定义运算函数(代替运算符)
#include <utility>//STL 通用模板类
using namespace std; void toSomething(promise<string> &p)
{
try{
cout << "read char ('x' for exception):";
//char c = cin.get();
char c;
default_random_engine dre(time(NULL));
uniform_int_distribution<int> id(, );
c = 'a' + id(dre);
//this_thread::sleep_for(chrono::milliseconds(5000));
if (c == 'x')
{
throw runtime_error(string("char ") + " read");
}
string s = string("char ") + c + " processed";
//在主函数调用get()方法时线程会停滞(block)直到share state 成为ready-当promise的set_value()或set_exception()执行后便是如此,也不意味promise的线程已经结束;
//该线程可能仍执行着其他语句,甚至储存其他结果放进其他promise内。
//如果想令shared state 在线程确实结束时变成ready-以确保线程的local object 及其他材料在释放前清除线程你应该使用set_value_at_thread_exit() and set_exception_at_thread_exit(),防止泄露
p.set_value_at_thread_exit(move(s));
}
catch (const exception &e)
{
p.set_exception_at_thread_exit(current_exception());
}
} int main()
{
try{
promise<string>p;//在线程定义前定义一个promise object。promise内部会建立y一个shared state, 在这里
//是用来放一个相应的类型的值或是一个异常,并可被future object 取其数据当线程结果
//这个promise随后被传给一个分离线程中运行的任务(task):
thread t(toSomething, ref(p));//借由ref() 确保promise以by reference(传地址)方式传递,使其可以被改变。
t.detach();//将线程分离主线程,使其在后台运行
future<string> f(p.get_future());//定义一个用来取promise结果的future(),它与promise()是匹配的
cout << "result: " << f.get() << endl;//获取线程的结果 }
catch (const exception &e)
{
cerr << "EXCEPTION:" << e.what() << endl;
}
system("pause");
return ;
}

C++Promise函数的更多相关文章

  1. ES6的promise函数用法讲解

    总结:Promise函数的出现极大的解决了Js中的异步调用代码逻辑编写太过复杂的问题,Promise对象让异步调用函数的流程显得更加的优雅,也更容易编写. 举例: 1. 异步调用: 假设现在我的一个页 ...

  2. 封装原生promise函数

    阿里面试题: 手动封装promise函数 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  3. promise函数

    一.promise函数是干什么的 promise函数是解决异步编程调用代码逻辑编写过于复杂的问题的,当网络请求非常复杂时,就会出现回调地狱,这样如果将这些代码写在一起就会看起来很复杂,且不利于阅读,如 ...

  4. Promise函数的使用

    最近在做批量打印并监控显示打印进度的功能,用到了很多异步函数,很多异步函数嵌套在回调函数里面,层层嵌套,导致代码可阅读性与可维护性变得十分糟糕,而且由于都是异步执行的函数,无法知道什么时候能回调结束, ...

  5. 为Promise添加finally方法支持,把小程序函数变成promise函数

    // 为Promise添加finally方法支持 Promise.prototype.finally = function (callback) {   let P = this.constructo ...

  6. 【学习笔记】浅析Promise函数

    一.Promise是什么? 在JavaScript中,所有的代码都是单线程执行,所以javaScript的所有网络操作(“GET”/"POST"/"PUT"/& ...

  7. 阿里前端测试题--关于ES6中Promise函数的理解与应用

    今天做了阿里前端的笔试题目,原题目是这样的 //实现mergePromise函数,把传进去的数组顺序先后执行,//并且把返回的数据先后放到数组data中 const timeout = ms => ...

  8. 如何手动封装Promise函数

    第一步:Promise构造函数接受一个函数作为参数,该函数的两个参数分别是:resolve和reject; function Promise(task) { // 缓存this let that = ...

  9. 理解Promise函数中的resolve和reject

    看了promise的用法,一直不明白里面的resolve和reject的用法: 运行了这两段代码之后彻底理解了promise的用法: var p = new Promise(function (res ...

随机推荐

  1. Centos系统下Lamp环境的快速搭建

    首先为了搭建一个稳定的lamp的练习环境,确保你的虚拟机可以连网,这里我们使用的yum安装,它可以帮助我们解决软件自己的依赖关系.我还在后面加了postgresql数据库如果不需要的话可以去掉和pos ...

  2. 20145224&20145238 《信息安全系统设计基础》 第四次实验

    20145224&20145238 <信息安全系统设计基础>第四次实验 课程:信息安全系统设计基础 班级:1452 姓名:陈颢文 荆玉茗 学号:20145224 20145238 ...

  3. 基础算法之快速排序Quick Sort

    原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的 ...

  4. gulp教程之gulp-imagemin

    简介: 使用gulp-imagemin压缩图片文件(包括PNG.JPEG.GIF和SVG图片) 1.安装nodejs/全局安装gulp/本地安装gulp/创建package.json和gulpfile ...

  5. Game02 最新版本2.0.0

    Game02发布转站于此,欢迎大家下载.... 简介: Game02是由ImGenius开发的一款即时在线小游戏.玩法简单,易于上手,主要靠技术,不会出现不要脸的充值等内容. 操控方法:W和A左右移动 ...

  6. 20140701立项 移植WatermarkLabelSys

    开始移植WatermarkLabelSys,从一个版本中抽离出最原始的内核,不求完善,只求能运行.时间半个月. 顺利的话针对不同的后缀.进程开始添加规则细节,时间1个月. 在顺利的话,兼容性测试,完善 ...

  7. ROS语音交互(四)接入图灵语义理解

    首先程序中会用到Json,curl 安装相应的库 $ sudo apt-get install libcurl3 libcurl4-openssl-dev$ sudo apt-get install ...

  8. Codeforces Round #384 (Div. 2) 解题报告

    这场CF水题都非常的水,D题如果对树.DFS相关比较熟练的话也不难.比赛时前三题很快就过了,可是因为毕竟经验还是太少,D题就卡住了.比赛之后A题还因为没理解对题意fst了--(为什么这次就没人来hac ...

  9. python学习05——字典

    笨办法学python第39节 这节主要讲解的是字典,首先字典和列表的两个区别是: 1. 列表中可以通过数字找到列表中的元素,是数字作为索引的:字典中可以通过任何东西找到想要的元素,即字典可以将一个物件 ...

  10. JavaScript中的作用域

    很多(JavaScript)开发者都在讨论"作用域",但它是什么?它们在JavaScript中的任何地方!我发现很多年轻的开发者不知道作用域是什么.他们中大多数人可以用jQuery ...