go使用线程锁,等待所有子线程执行完毕示例
package mainimport ("fmt""sync"
)var count int64
var countSync int64func main() {fmt.Println("开始执行")var wg sync.WaitGroupwg.Add(2000) // 设置等待组的计数器为3var wgPtr *sync.WaitGroup // 声明一个指向sync.Mutex的指针wgPtr = &wgvar mu sync.Mutex // 声明一个sync.Mutex类型的锁var muPtr *sync.Mutex // 声明一个指向sync.Mutex的指针muPtr = &mu // 将mu的地址赋值给muPtrfor 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
}