首页 > 其他 > 详细

Golang协程并发(并行)的资源竞争问题(1.使用全局互斥锁)

时间:2021-02-15 23:21:05      阅读:20      评论:0      收藏:0      [点我收藏+]

技术分享图片

其实最好的方法是使用动态规划。。。

代码实现(使用goroutine和全局互斥锁)

package main


import (
	"fmt"
	"sync"
	"time"
)

// 全局变量myMap
var (
	myMap = make(map[int]int, 20)
	lock sync.Mutex
)

func caltulateFactorial(n int){
	res := 1
	for i:=1;i<=n;i++{
		res *= i
	}
	
	// 加锁
	lock.Lock()
	// 将res放入myMap中
	myMap[n] = res
	// 解锁
	lock.Unlock()
}

func main(){
	
	// 开启200个协程
	for i:=1;i<=20;i++{
		go caltulateFactorial(i)
	}
	
	// 等待10s后输出结果
	time.Sleep(5 * time.Second)
	lock.Lock()
	for k, v := range myMap{
		fmt.Println(k,"的阶乘 =", v)
	}
	lock.Unlock()
}

结果

PS D:\VSCodeProjects\GoProject\src\main> go build -race main.go
PS D:\VSCodeProjects\GoProject\src\main> .\main.exe
9 的阶乘 = 362880
13 的阶乘 = 6227020800
15 的阶乘 = 1307674368000
17 的阶乘 = 355687428096000
19 的阶乘 = 121645100408832000
20 的阶乘 = 2432902008176640000
4 的阶乘 = 24
10 的阶乘 = 3628800
11 的阶乘 = 39916800
12 的阶乘 = 479001600
16 的阶乘 = 20922789888000
1 的阶乘 = 1
3 的阶乘 = 6
8 的阶乘 = 40320
14 的阶乘 = 87178291200
2 的阶乘 = 2
5 的阶乘 = 120
6 的阶乘 = 720
7 的阶乘 = 5040
18 的阶乘 = 6402373705728000
PS D:\VSCodeProjects\GoProject\src\main>

Golang协程并发(并行)的资源竞争问题(1.使用全局互斥锁)

原文:https://www.cnblogs.com/pangqianjin/p/14403683.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!