sync.Cond用来实现条件变量,条件变量一般用来协调线程使用,本例子模拟百米赛跑,选手各就各位后听到信令抢响后一起开始跑,参考代码:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(10)
cond := sync.NewCond(&sync.Mutex{})
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Printf("Runner %d reay!!!\n", i)
cond.L.Lock()
cond.Wait()
cond.L.Unlock()
fmt.Printf("Runner %d is running...\n", i)
wg.Done()
}(i)
}
time.Sleep(5 * time.Second)
fmt.Println("Beng beng...")
cond.Broadcast()
wg.Wait()
}
sync.Mutex用来保护条件变量。
sync.Signal一次可以唤醒一个goroutine,参考代码:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(10)
cond := sync.NewCond(&sync.Mutex{})
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Printf("Runner %d reay!!!\n", i)
cond.L.Lock()
cond.Wait()
cond.L.Unlock()
fmt.Printf("Runner %d is running...\n", i)
wg.Done()
}(i)
}
time.Sleep(2 * time.Second)
for i := 0; i < 10; i++ {
cond.Signal()
time.Sleep(time.Second)
fmt.Printf("signal %d\n", i)
}
wg.Wait()
}