sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程序线程,高水平的同步使用channel通信更好一些。
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup items := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} // 使用for循环创建所需的Goroutine for index, _ := range items { // 每次调用sync.Add()都会增加sync.WaitGroup变量中的计数器。需要注意的是,在go语句之前调用sync.Add(1)非常重要,以防止出现任何竞争条件。 //wg.Add(1) wg.Add(2) index := index go func() { fmt.Printf("item:%v \n", items[index]) // 当每个Goroutine:完成其工作时,将执行sync.Done()函数,以减少相同的计数器。 defer wg.Done() defer wg.Done() }() } fmt.Printf("%#v\n", wg) //sync.Wait()调用将阻塞,直到sync.WaitGroup 变量中的计数器为零,从而保证所有Goroutine能执行完成。 wg.Wait() }
当Add()和Done()的数量不匹配时会发生什么?
代码可能会执行,但是会panic: sync: negative WaitGroup counter 错误.