这个实例通过循环实现并行的分段求和计算,再把各个子段和加到总和中。

通过这个实例可以了解如何实现循环并行处理,以及有关的编程技巧。

但是这个程序是有问题的,因为可能发生变量访问冲突问题,导致计算结果不正确。这个程序是不稳定的,有时能够计算出不正确的结果,有时能够计算出正确结果。

程序中的变量sum是共享变量,需要使用同步用的互斥锁来保证计算的正确性。正解程序附在本博文的最后。

Go语言程序(不稳定,会出错):

// loopgoroutine project main.go
package mainimport ("fmt""runtime""time"
)const START = 1
const LEN = 100
const STEP = 1000var sum int64func main() {fmt.Printf("%d\n", (int64(LEN*STEP) * (int64(LEN*STEP) + 1) / int64(2)))sum = 0start := STARTfor i := 1; i <= STEP; i++ {go subsum(start, LEN)start += LEN}for runtime.NumGoroutine() > 1 {time.Sleep(100 * time.Millisecond)}fmt.Printf("%d\n", sum)
}func subsum(start int, len int) {var ssum int64ssum = 0for i := 1; i <= len; i++ {ssum += int64(start)start++}sum += ssum
}

运行结果(可能是以下两种,也可能算出其他的结果):

5000050000
5000050000
5000050000
4713772650

程序说明:

1.这个程序总的功能是计算1到100000(LEN×STEP)的和,计算被分为STEP步(段)进行,通过调用函数subsum()计算每段之和,然后相加

2.函数subsum()计算从start开始长度为len的数列之和

3.语句"fmt.Printf("%d\n", (int64(LEN*STEP) * (int64(LEN*STEP) + 1) / int64(2)))"打印输出一个正确的结果作为参考值

4.为了知道程序当前有几个goroutine在运行,需要使用包"runtime",其中的方法runtime.NumGoroutine()返回正在运行的goroutine的数量,需要注意的是main()本身也是一个goroutine

5.使用包"time"中的方法time.Sleep(),让自身的goroutine休眠,代入参数指定休眠0.1秒,因为需要等待所有其他goroutine都执行完之后程序才能结束

6.使用互斥锁mu来锁住变量sum(参见程序),需要使用包"sync"

Go语言程序(正解):

// loopmutex project main.go
package mainimport ("fmt""runtime""sync""time"
)const START = 1
const LEN = 100
const STEP = 1000var (mu  sync.Mutexsum int64
)func main() {fmt.Printf("%d\n", (int64(LEN*STEP) * (int64(LEN*STEP) + 1) / int64(2)))sum = 0start := STARTfor i := 1; i <= STEP; i++ {go subsum(start, LEN)start += LEN}for runtime.NumGoroutine() > 1 {time.Sleep(100 * time.Millisecond)}fmt.Printf("%d\n", sum)
}func subsum(start int, len int) {var ssum int64ssum = 0for i := 1; i <= len; i++ {ssum += int64(start)start++}mu.Lock()sum += ssummu.Unlock()
}

Go语言实现并行分段求和计算相关推荐

  1. c语言中输入x分段函数值,c语言程序改错:输入x,计算并输出分段函数y的值.0 x0...

    C语言 . 输入半径R ,并计算圆的面积S 和周长L .3. 编写一个程序实现把小写字母转换成大写字母.比如 #includeintmain(){floatr,s,l;scanf("%f&q ...

  2. r语言数据变量分段_使用R语言实现数据分段

    使用R语言实现数据分段 今天跟大家讲讲我工作中用到的数据分段,数据分段一般在什么地方会使用到呢?评分.之前写过一篇<实战: RFM>模型使用,那篇文章就详细介绍了CRM(客户关系管理)分析 ...

  3. c语言算正方形面积和周长,c语言中编写一程序计算正方形的周长和面积

    C语言 编写程序,从键盘输入一个正数,计算该数的平方根. #include#includeintmain(){\x09doublex;\x09scanf("%lf",&x) ...

  4. 什么是ForkJoin、ForkJoin分支合并、ForkJoin工作窃取、ForkJoin大数据求和计算

    什么是ForkJoin.ForkJoin分支合并.ForkJoin工作窃取.ForkJoin大数据求和计算 什么是ForkJoin? ForkJoin:分支合并 ForkJoin特点:工作窃取 如何让 ...

  5. matlab编写正整数阶乘函数,用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值....

    点击查看用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值.具体信息 答:编写一个matlab文件,求1到n的阶乘之和.其代码编写的目的,就是学会自定义 ...

  6. R语言stringr包str_count函数计算字符串匹配个数实战

    R语言stringr包str_count函数计算字符串匹配个数实战 目录 R语言stringr包str_count函数计算字符串匹配个数实战 #导入stringr包 #仿真数据

  7. R语言使用t.test函数计算两组独立数据的t检验(Independent t-test)

    R语言使用t.test函数计算两组独立数据的t检验(Independent t-test) 目录 R语言使用t.test函数计算两组独立数据的t检验(Independent t-test) #仿真数据

  8. R语言随机森林模型:计算随机森林模型的特征重要度(feature importance)并可视化特征重要度、使用少数重要特征拟合随机森林模型(比较所有特征模型和重要特征模型在测试集上的表现差异)

    R语言随机森林模型:计算随机森林模型的特征重要度(feature importance)并可视化特征重要度.使用少数重要特征拟合随机森林模型(比较所有特征模型和重要特征模型在测试集上的表现差异) 目录

  9. R语言按组聚合求和实战(sum a variable by group):使用aggregate函数按组聚合求和、使用tapply函数按组聚合求和、按组聚合求和(使用dplyr包)

    R语言按组聚合求和实战(sum a variable by group):使用aggregate函数按组聚合求和.使用tapply函数按组聚合求和.按组聚合求和(使用dplyr包) 目录

最新文章

  1. Ubuntu 16.04 GNOME在桌面左侧添加启动器(Launcher)
  2. TTThumbsViewController 由 4张 改为 3张的方式 增补
  3. 【模型训练】如何选择最适合你的学习率变更策略
  4. TinyMCE 新增本地图片上传功能
  5. MYSQL 表的修复(不断更新)
  6. Spring Boot笔记-validation的使用及统一异常处理
  7. HDU1542--Atlantis(扫描线)
  8. C#------引用System.Data.Entity后DbContext依然无法继承解决方法
  9. 面试时,如何向公司提问?
  10. 【王道计组笔记】数制、编码、校验
  11. (转载)用C#实现MySQL建库及建表
  12. 未来的人工智能和 AR/VR 会从哪些方面影响教育?有什么机会?
  13. java 红牛摩托车_2017红牛世界五大越野摩托车系列耐力赛
  14. 基于python-django的neo4j人民的名义关系图谱查询系统
  15. 虚拟服务器的常用服务器选什么,如何选择合适的虚拟主机,虚拟主机选什么系统...
  16. linux驱动调试技巧:灌寄存器---------以mma7660为例
  17. Excel技巧大杂烩
  18. 区块链+社群经济是什么样子?让「牛顿」的NewMall告诉你
  19. VirtualBox扩展包安装教程(保姆级一步到位)
  20. 推荐一款Xml编辑器(XML Notepad)

热门文章

  1. Google FlatBuffers——开源、跨平台的新一代序列化工具
  2. 与Xcode相比Adobe AIR开发iOS的优势和局限
  3. 修改linux端口22,修改LINUX 默认的22端口
  4. 5gh掌上云计算认证不通过_5GH币项目介绍及评级分析
  5. oracle concepts中文,Oracle Concepts 中英文对照版 (10g R2)
  6. hive 外部表不支持添加列
  7. Flume的安装与使用
  8. 用法 the_英语冠词:不定冠词a,an和定冠词the的用法
  9. 数组-scala数组与java的list的互转
  10. java解析pom.xml_从pom.xml java获取变量