Golang-goroutine03(使用时会产生的问题)

    科技2025-05-05  13

    计算1-200的各个数的阶乘将结果放到map中,使goroutine完成

    package main import( "fmt" ) //计算1-200的各个数的阶乘将结果放到map中,使goroutine完成 //思路 //编写一个函数, 计算各个数的阶乘,放到map中 //启动的协程多个,统计结果放入map中 //map应该时全局的 //全局形式 var ( myMap = make(map[int]int) ) func test( n int){ res := 1 for i:=1; i<=n ; i++{ res *= i } map[n] = res } func main(){ for i:=1; i<= 200; i++{ //问题2 //多个协程产生了对map的并发写 go test(i) //开启两百个协程 } //问题1: //直接开始这边的for,map会是空 //因为主线程结束,协程强制退出 for i, v := range myMap{ fmt.Printf("map[%d] = %d\n", i, v) } }

    除了两个问题,补充知识点: 运行某个程序时,如何知道是否存在资源竞争关系?在编译该程序时加一个 -race即可:go buile -race main.go

    解决并发问题,给全局变量加lcok() 1.加入一个time包,time.Sleep()保证协程先运行完成 2.加入一个sync包,声明一个lock sync.Mutex的结构体,用lock.Lock()与lock.Unlock()方法对资源加锁,保证互斥访问

    package main import( "fmt" "sync" "time" ) //计算1-200的各个数的阶乘将结果放到map中,使goroutine完成 //思路 //编写一个函数, 计算各个数的阶乘,放到map中 //启动的协程多个,统计结果放入map中 //map应该时全局的 //全局形式 var ( myMap = make(map[int]int) //声明一个全局的互斥锁 //lock 是一个全局的互斥锁 //sync 是一个同步包 //Mytex 是一个互斥结构体 lock sync.Mutex ) func test( n int){ res := 1 for i:=1; i<=n ; i++{ res *= i } //加锁 lock.Lock() //解决问题2 myMap[n] = res lock.Unlock() } func main(){ for i:=1; i<= 200; i++{ //问题2 //多个协程产生了对map的并发写 go test(i) //开启两百个协程 } time.Sleep(time.Second * 5) //解决问题1 //问题1: //直接开始这边的for,map会是空 //因为主线程结束,协程强制退出 lock.Lock() //虽然我们设计了休眠5秒 //但是主线程并不知道,还可能出现资源争夺 for i, v := range myMap{ fmt.Printf("map[%d] = %d\n", i, v) } lock.Unlock() }
    Processed: 0.019, SQL: 8