第7章 并发

阅读 56

2022-02-28

go func() {
	fmt.Println("Hello, World!")
}()
func sum(id int) {
	var x int64
	for i := 0; i < math.MaxUint32; i++ {
		x += int64(i)
	}
	fmt.Println(id, x)
}

func main() {
	wg := new(sync.WaitGroup)
	wg.Add(2)
	for i := 0; i < 2; i++ {
		go func(id int) {
			defer wg.Done()
			sum(id)
		}(i)
	}
	wg.Wait()
}
/*
	1 9223372030412324865
	0 9223372030412324865
*/

/*
linux下执行该命令:
$ go build -o test
$ time -p ./test
0 9223372030412324865
1 9223372030412324865
real 7.70 // 程序开始到结束时间差 (⾮ CPU 时间)
user 7.66 // ⽤户态所使⽤ CPU 时间⽚ (多核累加)
sys 0.01 // 内核态所使⽤ CPU 时间⽚
$ GOMAXPROCS=2 time -p ./test
0 9223372030412324865
1 9223372030412324865
real 4.18
user 7.61 // 虽然总时间差不多,但由 2 个核并⾏,real 时间⾃然少了许多。
sys 0.02
*/
func main() {
	wg := new(sync.WaitGroup)
	wg.Add(1)
	go func() {
		defer wg.Done()
		defer fmt.Println("A.defer")
		func() {
			defer fmt.Println("B.defer")
			runtime.Goexit() // 终⽌当前 goroutine
			fmt.Println("B") // 不会执⾏
		}()
		fmt.Println("A") // 不会执⾏
	}()
	wg.Wait()
	/*
		B.defer
		A.defer
	*/
}
func main() {
	wg := new(sync.WaitGroup)
	wg.Add(2)
	go func() {
		defer wg.Done()
		for i := 0; i < 6; i++ {
			fmt.Println(i)
			if i == 3 {
				runtime.Gosched() //当i=3时,暂停当前协程
			}
		}
	}()
	go func() {
		defer wg.Done()
		fmt.Println("Hello, World!")
	}()
	wg.Wait()
	/*
		0
		1
		2
		3
		Hello, World!
		4
		5
	*/
}

精彩评论(0)

0 0 举报