go 并发锁初级文章

package main

import (
	"fmt"
	"runtime"
	"strconv"
	"time"
)

func test() {
	for i := 1; i < 10; i++ {
		fmt.Println("hello.main" + strconv.Itoa(i))
		time.Sleep(time.Second)
	}
}

func main() {
	/*go test()
	for i := 1; i < 10; i++ {
		fmt.Println("hello.go" + strconv.Itoa(i))
		time.Sleep(time.Second)
	}*/

	cpuNum := runtime.NumCPU()
	fmt.Println("cpu=", cpuNum)
	//可以设置自己使用CPU
	runtime.GOMAXPROCS(cpuNum - 1)
	fmt.Println("ok")

}


//互斥锁来避免资源抢占

package main

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

//1-200各个数的结成,并且把各个数放到map中。goroutine
var (
	myMap = make(map[int]int, 10)

	//声明一个全局的互斥锁
	lock sync.Mutex
)

//test函数就是计算n! ,将这个结果放到map中
func test(n int) {
	res := 1
	for i := 1; i <= n; i++ {
		res *= i
	}

	//这里我们将res放到map
	lock.Lock()
	myMap[n] = res

	//解锁
	lock.Unlock()
}
func main() {

	//go build -race main.go
	//Found 2 data race(s)
	// 我们这里开启多个协程完成这个任务
	for i := 1; i <= 200; i++ {
		go test(i)
	}
	//这里我们遍历这个结果
	time.Sleep(10 * time.Second)
	lock.Lock()
	for i, v := range myMap {
		fmt.Printf("map[%d]=%d \n", i, v)
	}
	lock.Unlock()
}

猜你喜欢

转载自blog.csdn.net/licanfeng1/article/details/132336653