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

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

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

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. [WPF]UserControl的MouseWheel事件触发

    用户控件: <UserControl> <Grid> <TextBox x:Name="textBlock" HorizontalAlignment= ...

  2. Socket.io和Redis写Realtime App 之express初试

    第一步:用npm下载express前端框架 注意事项:首先要确保已经安装了node.js和 npm 然后在项目中创建一个package.json文件,不能完全为空不写,至少要有两个大括号,不然怎么证明 ...

  3. CentOS下设置MySQL的root密码

    CentOS刚装的MySQL一般需要重设MySQL密码,可以用以下方法重设. 方法一. Js代码  # /etc/init.d/mysqld stop  # mysqld_safe --user=my ...

  4. mysql执行大量sql语句

    今天需要通过csv上传大量数据到数据库 直接逐行执行insert效率极其低下 后面通过拼接insert,稍微提高了些许效率,但依然不满足 最后发现,把这些插入放入同一个事务里面可以大大提高效率 beg ...

  5. 自己建二维obj

    经常用到啊 在项目流程管理里面用到

  6. 修改主机hostname

    1 修改hostname配置文件 vi /etc/sysconfig/network中的HOSTNAME 2 修改完后,使用hostname命令验证,发现hostname还是原来的 退出shell重新 ...

  7. Guava----Function

    1. Function接口,提供两个方法: apply方法: 可以自定义自己想实现的功能 @Nullable T apply(@Nullable F input); 1. 实例: import com ...

  8. FTP多任务下载实现类

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. maven添加本地jar包

    今天遇到一个mavan仓库中没有的jar包, 故只能添加本地jar包, 花了不少时间找资料,终于OK.故在此记录. 1. 第一次,在网上看到说可以用<systemPath> 解决, 如下: ...

  10. C# 技巧(3) C# 操作 JSON

    RestAPI中, 经常需要操作json字符串,  需要把json字符串"反序列化"成一个对象, 也需要把一个对象"序列化"成一字符串. C# 操作json, ...