条件等待与互斥锁 (sync.Mutex) 不同,互斥锁是不同协程间共用一个锁,而条件等待是不同协程各用各自的锁,wait() 方法会阻塞当前协程,直到有信好发来为止,信号是所有协程共用的,但一个信号只能唤醒一个 wait()。

    1. package main
    2. import (
    3. "fmt"
    4. "sync"
    5. "time"
    6. )
    7. func main() {
    8. var wg sync.WaitGroup
    9. cond := sync.NewCond(new(sync.Mutex))
    10. for i := 0; i < 3; i++ {
    11. go func(index int) {
    12. fmt.Println("协程", index, "启动")
    13. wg.Add(1)
    14. defer wg.Done()
    15. cond.L.Lock()
    16. fmt.Println("协程", index, "加锁")
    17. cond.Wait()
    18. fmt.Println("协程", index, "解锁")
    19. cond.L.Unlock()
    20. }(i)
    21. }
    22. time.Sleep(time.Second)
    23. fmt.Println("主协程发送信号量1")
    24. cond.Signal()
    25. time.Sleep(time.Second)
    26. fmt.Println("主协程发送信号量2")
    27. cond.Signal()
    28. time.Sleep(time.Second)
    29. fmt.Println("主协程发送信号量3")
    30. cond.Signal()
    31. wg.Wait()
    32. }

    image.png