https://blog.csdn.net/jinglexy/article/details/80516788
Signal 发现等待最长时间的 goroutine 并通知它,而 Broadcast 向所有等待 的 goroutine 发送信号。
package main
import (
"fmt"
"sync"
"time"
)
var locker = new(sync.Mutex)
var cond = sync.NewCond(locker)
func test(x int) {
cond.L.Lock() //获取锁
fmt.Println("in: ", x)
cond.Wait() //等待通知 暂时阻塞
fmt.Println("do: ", x)
time.Sleep(time.Second * 2)
cond.L.Unlock()//释放锁
fmt.Println("out: ", x)
}
func main() {
for i := 0; i < 5; i++ {
go test(i) //所有线程都获取锁
}
fmt.Println("start all")
time.Sleep(time.Second * 10)
fmt.Println("Signal") // 下发一个通知给已经获取锁的goroutine
cond.Signal()
time.Sleep(time.Second * 5)
fmt.Println("Signal") // 下发一个通知给已经获取锁的goroutine
cond.Signal()
time.Sleep(time.Second * 5)
fmt.Println("broadcast")
cond.Broadcast()
time.Sleep(time.Second * 10)
fmt.Println("finish all")
}