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
}