async意味着异步执行代码,看如下示例:

  1. #include <future>
  2. #include <thread>
  3. #include <chrono>
  4. #include <random>
  5. #include <iostream>
  6. #include <exception>
  7.  
  8. using namespace std;
  9.  
  10. int do_something(char c)
  11. {
  12. std::default_random_engine dre(c);
  13. std::uniform_int_distribution<int> id(10, 1000);
  14.  
  15. for (int i = 0; i < 10; ++i)
  16. {
  17. this_thread::sleep_for(chrono::microseconds(id(dre)));
  18. cout << c << ends;
  19. }
  20.  
  21. return c;
  22. }
  23.  
  24. int main() {
  25. cout << "begin ..." << endl;
  26. std::future<int> result = std::async(do_something, 'c');
  27. cout << "waiting for result ..." << endl;
  28. cout << "\n" << result.get() << endl;
  29. cout << "finish!" << endl;
  30. }

当对result调用get时,如果此时do_something函数还没有执行完毕,那么会导致main函数阻塞在这里,一直到该函数执行完毕。

 

async返回的是一个future对象,从字段意思上推测,结果是在未来的某一个时刻拿到。

async实际上是在背后偷偷的开启一个线程执行函数,但是上面的实例看不出来,于是我们写一个复杂一些的实例:

  1. #include <future>
  2. #include <thread>
  3. #include <chrono>
  4. #include <random>
  5. #include <iostream>
  6. #include <exception>
  7.  
  8. using namespace std;
  9.  
  10. int do_something(char c)
  11. {
  12. std::default_random_engine dre(c);
  13. std::uniform_int_distribution<int> id(10, 1000);
  14.  
  15. for (int i = 0; i < 10; ++i)
  16. {
  17. this_thread::sleep_for(chrono::microseconds(id(dre)));
  18. cout << c << ends;
  19. }
  20.  
  21. return c;
  22. }
  23.  
  24. int func1()
  25. {
  26. return do_something('.');
  27. }
  28.  
  29. int func2()
  30. {
  31. return do_something('*');
  32. }
  33.  
  34. int main()
  35. {
  36. cout << "start ..." << endl;
  37. // std::future<int> result1(std::async(std::launch::deferred, func1));
  38. std::future<int> result1(std::async(func1));
  39.  
  40. int result2 = func2();
  41.  
  42. int result = result1.get() + result2;
  43.  
  44. cout << "\nresult of func1() + func2(): " << result << endl;
  45. }

这个程序的执行结果中 .和*乱序出现,说明func1和func2是乱序执行的,这是因为func1是在另一个线程中执行的。

C++11中async中future用法(一)的更多相关文章

  1. C#中async和await用法

    .net 4.5中新增了async和await这一对用于异步编程的关键字. async放在方法中存在await代码的方法中,await放在调用返回Task的方法前. class Class1 { pr ...

  2. (转)Spring中@Async用法总结

     原文:http://blog.csdn.net/blueheart20/article/details/44648667 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的: ...

  3. Spring中@Async用法总结

    引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3. ...

  4. Spring中@Async用法详解及简单实例

    Spring中@Async用法 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类 ...

  5. [翻译] Python 3.5中async/await的工作机制

    Python 3.5中async/await的工作机制 多处翻译出于自己理解,如有疑惑请参考原文 原文链接 身为Python核心开发组的成员,我对于这门语言的各种细节充满好奇.尽管我很清楚自己不可能对 ...

  6. SpringBoot中Async异步方法和定时任务介绍

    1.功能说明 Spring提供了Async注解来实现方法的异步调用. 即当调用Async标识的方法时,调用线程不会等待被调用方法执行完成即返回继续执行以下操作,而被调用的方法则会启动一个独立线程来执行 ...

  7. 【转】Spring中@Async

    Spring中@Async 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实, ...

  8. C#中timer类的用法

    C#中timer类的用法 关于C#中timer类  在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类 ...

  9. Spring中@Async注解实现“方法”的异步调用

    原文:http://www.cnblogs.com/zhengbin/p/6104502.html 简单介绍: Spring为任务调度与异步方法执行提供了注解支持.通过在方法上设置@Async注解,可 ...

随机推荐

  1. eclipse新建项目,报错“Error: workspace\appcompat_v7\res\values-v21\styles_base.xml No resource found that matches the given name”

    新建项目报错,不知道为什么,以前从未出现过的错误,把sdk更新之后,出现莫名错误,自己也是一知半解,在网上找了好久的错误,终于在一个english网站找到了解决方法,soga,从未觉得english如 ...

  2. C# upnp

    //获取Host Name var name = Dns.GetHostName(); Console.WriteLine("用户:" + name); //从当前Host Nam ...

  3. 企业项目如何打包成.ipa文件

    首先准备好企业的项目,真机和申请好的正式证书,关于企业证书的申请此处不再写,可以参考网上相关的教程,本人并未参与证书申请,所以此处不敢乱写. 1.找到正式证书与描述文件,双击打开(需要密码,这个要问申 ...

  4. flash builder关掉自动编译功能

    菜单栏 项目,里面有个自动构建,把√去掉就ok了

  5. linux ddos防御攻击

    Linux Ddos防御攻击 [root@lxh ~]# netstat -ntu |awk '{print $5}'|grep '[0-9]'|cut -d: -f1 |sort |uniq -c| ...

  6. iOS获取当前app的名称和版本号

    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; CFShow(infoDictionary); // ap ...

  7. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  8. js 去掉字符串前后空格

    //去左空格; function ltrim(s){ return s.replace(/(^\s*)/g, ""); } //去右空格; function rtrim(s){ r ...

  9. ng-bind,ng-cloak优化数据显示

    <div>{{text}}</div> 当我们使用angular在页面中有取值的时候,如果出现网络加载慢的问题,可能会在页面上出现{{text}}这种不好的体验,那么angul ...

  10. UICollectionCell可移动的逻辑