条件等待与互斥锁 (sync.Mutex) 不同,互斥锁是不同协程间共用一个锁,而条件等待是不同协程各用各自的锁,wait() 方法会阻塞当前协程,直到有信好发来为止,信号是所有协程共用的,但一个信号只能唤醒一个 wait()。
package mainimport ("fmt""sync""time")func main() {var wg sync.WaitGroupcond := sync.NewCond(new(sync.Mutex))for i := 0; i < 3; i++ {go func(index int) {fmt.Println("协程", index, "启动")wg.Add(1)defer wg.Done()cond.L.Lock()fmt.Println("协程", index, "加锁")cond.Wait()fmt.Println("协程", index, "解锁")cond.L.Unlock()}(i)}time.Sleep(time.Second)fmt.Println("主协程发送信号量1")cond.Signal()time.Sleep(time.Second)fmt.Println("主协程发送信号量2")cond.Signal()time.Sleep(time.Second)fmt.Println("主协程发送信号量3")cond.Signal()wg.Wait()}

