C++Promise函数

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(0, 24);
        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 0;
}
时间: 2024-08-24 01:44:45

C++Promise函数的相关文章

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

今天做了阿里前端的见识题目,原题目是这样的 //实现mergePromise函数,把传进去的数组顺序先后执行,//并且把返回的数据先后放到数组data中 const timeout = ms => new Promise((resolve, reject) => {setTimeout(() => {resolve();}, ms);}); const ajax1 = () => timeout(2000).then(() => {console.log('1');retur

js callback promise async await 几种异步函数处理方式

***callback  这个是最常用的也是最简单的 ,比如在ajax网络请求中,返回请求完成返回的数据 回调函数就是把一个函数当成另一个函数的参数,可以传递函数内的局部变量,也可以异步完成一些操作,在函数的实现里调用回调函数,在函数的调用里实现回调函数 // 回調函數的方式 閉包 可以獲取函數內部的局部變量 function testCallback(callback) { let a = 1; let b = 2; if (a < b) { callback && callbac

ECMAScript6的Promise对象

1. 概念 Promise对象用于异步(asynchronouss)计算,一个Promise对象代表着一个还未完成,但预期完成的操作. 2. 出现原因: 1)  如果你需要通过ajax发送多次请求,而每一次请求依赖上一次请求返回的结果作为参数来继续下次的请求,这样的话,就需要这么写代码: 上面的例子,假设请求C需要依赖B返回的数据,那么C需要放在B的success函数里面.同样的,A需要依赖B返回的数据,那么A也需要放在B的success函数里面.假设现在存在很多个请求,请求之前是相互的依赖关系

Promise/Generator/Co

---恢复内容开始--- 这三个都是为解决回调而生的, 最近在学习Koa框架, Koa框架主要就是将异步的写法变成的同步, 解决了回调地狱的问题,也易于流程的控制, 于是找了很多篇文章学习, 终于有点感悟了~ >-< 1.Promise 看名字,Promise(承诺), 很容易联想到, 这个应该是异步操作结果的承诺, 就像数据库操作, 我们要先去find(), find到了之后就去save(), 那我们承诺find到结果后就去save, 这样就实现了异步写法变同步写法 Promise.then

细嗅Promise

读完这篇文章,预计会消耗你 40 分钟的时间. Ajax 出现的时候,刮来了一阵异步之风,现在 Nodejs 火爆,又一阵异步狂风刮了过来.需求是越来越苛刻,用户对性能的要求也是越来越高,随之而来的是页面异步操作指数般增长,如果不能恰当的控制代码逻辑,我们就会陷入无穷的回调地狱中. ECMAScript 6 已经将异步操作纳入了规范,现代浏览器也内置了 Promise 对象供我们进行异步编程,那么此刻,还在等啥?赶紧学习学习 Promise 的内部原理吧! 第一章 了解 Promise 一.场景

ES6新特性:Javascript中内置的延迟对象Promise

Promise的基本使用: 利用Promise是解决JS异步执行时候回调函数嵌套回调函数的问题, 更简洁地控制函数执行流程: 通过new实例化Promise,  构造函数需要两个参数, 第一个参数为函数执行成功以后执行的函数resolve, 第二个函数为函数执行失败以后执行的函数reject: new Promise(function(resolve , reject) { }); 通过Promise,我们把回调函数用线性的方式写出来,而不是一层套一层, 这个函数有四层回调: fn("args&

JavaScript及其异步实现续:Promise让一切更简单

在写这篇文章之前,我参考了以下文章.所以我文中的例子都是精准的,而且有循可依.下面抛出例子的链接: Understanding JQuery.Deferred and PromiseDeferred and promise in jQuery Edit:在翻网站的时候,看到腾讯技术团队居然也刚写了一篇Promise的文章,加下链接,以作备忘. JavaScript Promise启示录 Deferred在JQuery1.5的版本被引进,这项功能的引进使JQuery变得更加强大,良好的异步支持,让

JavaScript进阶之路——认识和使用Promise,重构你的Js代码

一转眼,这2015年上半年就过去了,差不多一个月没有写博客了,"罪过罪过"啊~~.进入了七月份,也就意味着我们上半年苦逼的单身生活结束了,从此刻起,我们要打起十二分的精神,开始下半年的单身生活.大家一起加油~~ 一直以来,JavaScript处理异步都是以callback的方式,在前端开发领域callback机制几乎深入人心.在设计API的时候,不管是浏览器厂商还是SDK开发商亦或是各种类库的作者,基本上都已经遵循着callback的套路.近几年随着JavaScript开发模式的逐渐成

es6,promise,generator,next,yield与koa

es6里有了很多新特性 promise是一种形式,使用promise可以让异步的代码像同步代码,从而更符合人类的思维方式,使回调函数的写法变得轻松 在函数中使用promise,一般是return一个用promise包裹的函数,如: 1 function t(arg){ 2 //准备工作,处理等 3 // ... 4 var istrue =arg+1 5 //处理结束 6 return new promise(function(resolve,reject{ 7 //判定并返回 8 if(ist