go使用线程锁,等待所有子线程执行完毕示例

go使用线程锁,等待所有子线程执行完毕示例

package main

import (
	"fmt"
	"sync"
)

var count int64
var countSync int64

func main() {
	fmt.Println("开始执行")
	var wg sync.WaitGroup
	wg.Add(2000)              // 设置等待组的计数器为3
	var wgPtr *sync.WaitGroup // 声明一个指向sync.Mutex的指针
	wgPtr = &wg

	var mu sync.Mutex     // 声明一个sync.Mutex类型的锁
	var muPtr *sync.Mutex // 声明一个指向sync.Mutex的指针
	muPtr = &mu           // 将mu的地址赋值给muPtr

	for i := 0; i < 1000; i++ {
		go countAdd(wgPtr)

	}

	for i := 0; i < 1000; i++ {
		go countAddSync(muPtr, wgPtr)
	}

	wg.Wait() // 等待所有goroutine执行完毕

	fmt.Println("所有goroutine执行完毕")

	fmt.Println("count=", count)
	fmt.Println("countSync=", countSync)
}

func countAdd(wg *sync.WaitGroup) {
	count++
	defer wg.Done() // 在goroutine执行完毕时将计数器减1
}

func countAddSync(mu *sync.Mutex, wg *sync.WaitGroup) {
	// 加锁
	mu.Lock()
	countSync++
	// 解锁
	mu.Unlock()     // 如果使用defer已经在函数返回时解锁,这里不需要再次解锁
	defer wg.Done() // 在goroutine执行完毕时将计数器减1
}

你可能感兴趣的:(GoLang,golang,开发语言,后端)