条件等待与互斥锁 (sync.Mutex) 不同,互斥锁是不同协程间共用一个锁,而条件等待是不同协程各用各自的锁,wait() 方法会阻塞当前协程,直到有信好发来为止,信号是所有协程共用的,但一个信号只能唤醒一个 wait()。
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
cond := 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()
}