[Modern C++]现代C++中的异步操作

背景

老实说,C++11中对异步的支持不必Python和JavaScript弱。

实现(代码)


  1. #include <iostream> 
  2. #include <vector> 
  3. #include <algorithm> 
  4. #include <future> 
  5.  
  6. template <typename RAIter> 
  7. int parallel_sum(RAIter front, RAIter beg, RAIter end) 
  8.     auto len = end - beg; 
  9.     if (len < 1000) 
  10.     { 
  11.         char out[50]; 
  12.         sprintf(out, "Calculate from %d to %d\n", beg - front, end - front); 
  13.         std::cout << out; 
  14.         return std::accumulate(beg, end, 0); 
  15.     } 
  16.  
  17.     RAIter mid = beg + len / 2; 
  18.     auto handle_right = std::async(std::launch::async, 
  19.                              parallel_sum<RAIter>, front, mid, end); 
  20.     auto handle_left = std::async(std::launch::async, 
  21.                              parallel_sum<RAIter>, front, beg, mid); 
  22.     return handle_left.get() + handle_right.get(); 
  23.  
  24. int main() 
  25.     std::vector<int> v(20000, 1); 
  26.     std::cout << "The sum is " << parallel_sum(v.begin(), v.begin(), v.end()) << '\n'; 

输出

可能一


  1. Calculate from 8125 to 8750                                                                                                                
  2. Calculate from 18125 to 18750                                                                                                              
  3. Calculate from 10625 to 11250                                                                                                              
  4. Calculate from 2500 to 3125                                                                                                                
  5. Calculate from 13750 to 14375                                                                                                              
  6. Calculate from 5000 to 5625                                                                                                                
  7. Calculate from 1250 to 1875                                                                                                                
  8. Calculate from 3750 to 4375                                                                                                                
  9. Calculate from 16250 to 16875                                                                                                              
  10. Calculate from 17500 to 18125                                                                                                              
  11. Calculate from 10000 to 10625                                                                                                              
  12. Calculate from 625 to 1250                                                                                                                 
  13. Calculate from 18750 to 19375                                                                                                              
  14. Calculate from 15625 to 16250                                                                                                              
  15. Calculate from 3125 to 3750                                                                                                                
  16. Calculate from 12500 to 13125                                                                                                              
  17. The sum is 20000  

可能二


  1. Calculate from 1875 to 2500 
  2. Calculate from 3750 to 4375  
  3. Calculate from 8750 to 9375  
  4. Calculate from 7500 to 8125  
  5. Calculate from 15000 to 15625  
  6. Calculate from 10000 to 10625  
  7. Calculate from 1250 to 1875  
  8. Calculate from 6875 to 7500  
  9. Calculate from 0 to 625 
  10. Calculate from 3125 to 3750  
  11. Calculate from 5625 to 6250  
  12. Calculate from 5000 to 5625  
  13. Calculate from 6250 to 6875  
  14. Calculate from 2500 to 3125  
  15. The sum is 20000 

可能.........

注意

如果在输出中间信息的时候不先现在字符串里输出会很乱,因为同一行cout输出不同项的操作不是原子的,中间可能会转到其他线程去。

作者:佚名

来源:51CTO

时间: 2024-09-28 12:57:09

[Modern C++]现代C++中的异步操作的相关文章

Socket类中提供的支持异步操作的方法

在网络编程中运用Socket,常常需要长期监听某个端口,以获得Socket连接,进而执行相关操作. 但此时,主线程就会被阻塞,无法做其他事情.为了解决这类问题,Socket类中提供了一些支持异步操作的方法,如表17-10所示. 表17-10 Socket类中支持异步操作的方法 方法 说明 BeginAccept() 开始一个异步请求,以创建一个新的Socket对象来接受传入的连接请求 EndAccept() 结束一个异步请求,以创建一个新的Socket对象来接受传入的连接请求 BeginConn

关于PHP实现异步操作的研究

  1.为啥PHP需要异步操作? 一般来说PHP适用的场合是web页面展示等耗时比较短的任务,如果对于比较花时间的操作如resize图片.大数据导入.批量发送EDM.SMS等,就很容易出现操作超时情况.你可以说我可以设置无限超时时间,等等你也要知道PHP有一个工作模式是fastcgi,PHP无限不超时,不代表fastcgi相应不超时--如果你还想说要fastcgi相应永不超时,我建议你应该跟你们的运维人员讨论去-- 这个时候异步的操作就发挥他的作用了,由于是非阻塞操作,操作会即时返回,然后在后台

在tomcat和ant中使用jikes

jikes 是一个速度远快于 javac 的 java 编译器. 整合 ant 的方法: 设置环境变量 JIKESHOME 为 jikes 的路径 设置 ANT_OPTS=-Dbuild.compiler=jikes 将 jikes 路径添加到系统 PATH 中 注意区分大小写.然后在所有的ant任务就默认使用 jikes 了, 如果你想在单个工程中使用 ant, 就不要添加 ANT_OPTS 环境变量, 只需要修改 build.xml 中 javac 标签中的 compiler 为 jikes

WebSphere Application Server中现代化的基于Java的批处理(一)

介绍 Modern Batch 和计算密集型的编程模型 简介 批处理程序是任何企业 IT 领域的一个传统且不可或缺的组件.目前的批处理发展趋势是将内部的 Java 技能应用于在线程序和批处理程序上,以确保: 最大限度地提高实现的重用. 更轻松的开发和维护,因为使用了相同的工具集. 企业标准和服务质量实施上的一致性. IBM 开发的解决方案提供了一种具有凝聚力的批处理程序管理模式.IBM WebSphere Application Server 的 Modern Batch 功能(可用于 WebS

异步操作和Web服务,第3部分:向Web服务添加业务语义

在这个系列的前面两部分,Holt Adams 解释了 Web 服务异步操作的相关性并讨论了一些构建异步服务的模式.现在,他要开始讲解三个新规范 ― Web 服务的业务流程执行语言(Business Process Execution Language for Web Services).Web 服务协调(Web Services Coordination)和 Web 服务事务(Web Services Transaction)― 并说明它们如何为 Web 服务开发者提供许多可能性.您将看到这三个

大型网站架构(4) 分布式中的异步通信

我们知道在面向对象编程中,总会想着各种办法来实现代码的解耦,从而让项目中的各种人员面对自己熟悉的业务进行开发,做到术业有专攻,比如大家非常熟悉的三层架构,MVC,MVP以及MVVM模式,让前端设计专注于html的制作,让后端开发人员更加专注于业务逻辑的编写,可以看到,我们这么做的目的就是想最大程度的做到系统的可扩展和可维护性,那么我们的大型网站是不是也要遵守这种模式呢? 一:分层和分割 1:分层 对于分层,我们可能非常熟知了,数据访问层,业务逻辑层,缓存层,应用层,层层专注于自己的业务,然后根据

使用BackgroundWorker组件进行异步操作编程

概述 在应用程序中,可能会遇到一些执行耗时的功能操作,比如数据下载.复杂计算及数据库事务等,一般这样的功能会在单独的线程上实现,执行结束后结果显示到用户界面上,这样可避免造成用户界面长时间无响应情况.在.NET 2.0及以后的版本中,FCL提供了BackgroundWorker组件来方便的实现这些功能要求. 组件介绍 BackgroundWorker 类位于System.ComponentModel 命名空间中,通过该类在单独的线程上执行操作实现基于事件的异步模式.下面对BackgroundWo

解决Win8下IE10中Flash内容无法打开的问题

1.检查内容能否以桌面模式播放 2.如果内容不能以桌面模式播放 a.禁用 ActiveX 筛选 b.启用 Flash Player c.安装 Flash Player 的最新版本 3.如果内容能以桌面模式播放 a.启用兼容性视图 (CV) 列表的更新 检查内容能否以桌面模式播放 如果内容未以 Modern 模式播放,请执行以下所述步骤,检查其是否以桌面模式播放: 注意:Flash Player 内嵌于这两个版本中.兼容性视图 (CV) 列表会启用 Modern 模式 Internet Explo

Win8中IE10里Flash内容不能打开怎么办

  使用过win8的朋友都能发现win8默认的浏览器变成了ie10了,而ie10又有两种模式,一种是桌面模式,令一种是Modern,桌面模式和以前ie浏览器没有多大的区别,用起来也很方便,Modern 版本具有全新的外观,更适合触控浏览 不少朋友在使用window8内置的浏览器的时候出现了Flash中内容打不开的现象,下面列出一些解决办法,仅供大家参考. 1.检查内容能否以桌面模式播放 2.如果内容不能以桌面模式播放 a.禁用 ActiveX 筛选 b.启用 Flash Player c.安装