go 的互斥锁

package main

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

/*需求:现在要计算 1-200 的各个数的阶乘,并且把各个数的阶乘放入到map中。
最后显示出来。要求使用goroutine完成

思路
1. 编写一个函数,来计算各个数的阶乘,并放入到 map中.
2. 我们启动的协程多个,统计的将结果放入到 map中,其实可以从最小的地方相加, 更快,n3 复用n2
3. map 应该做出一个全局的.*/

var (
	myMap = make(map[int]int, 10)
	//声明一个全局的互斥锁
	//lock 是一个全局的互斥锁,
	//sync 是包: synchornized 同步
	//Mutex : 是互斥
	lock sync.Mutex
)

// test 函数就是计算 n!, 让将这个结果放入到 myMap
func test(n int) {
	var res int
	for i := 1; i <= n; i++ {
		res += i
	}
	//这里我们将 res 放入到myMap
	//加锁 多个goroutine线程对myMap进行修改,导致 fatal error: concurrent map writes错误,所以要加goroutine
	lock.Lock()
	myMap[n] = res  //concurrent map writes?
	//解锁
	lock.Unlock()
}

func main() {
	// 我们这里开启多个协程完成这个任务[200个]
	for n := 1; n <= 100; n++ {
		go test(n)
	}
	//休眠10秒钟【第二个问题 】
	time.Sleep(time.Second * 5)

	//这里我们输出结果,变量这个结果
	//lock.Lock()
	for i, v := range myMap {
		fmt.Printf("map[%d]=%d\n", i, v)
	}
	//lock.Unlock()

}
posted @ 2022-03-13 00:13  ty1539  阅读(45)  评论(0编辑  收藏  举报