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


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

    代码实现(使用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(){
    	
    	// 开启20个协程
    	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:VSCodeProjectsGoProjectsrcmain> go build -race main.go
    PS D:VSCodeProjectsGoProjectsrcmain> .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:VSCodeProjectsGoProjectsrcmain>
    
  • 相关阅读:
    养生之《爱的供养》
    道家养生,与佛家养德
    个人的佛法·5·活着,与死去
    自我囚禁与安住于轮回
    个人的佛法·4·我是不是东西?
    个人的佛法·2
    我们都是生命的灯塔
    大O表示法是什么?
    uni-app商城项目(01)
    2059
  • 原文地址:https://www.cnblogs.com/pangqianjin/p/14403683.html
Copyright © 2020-2023  润新知