sync.Cond解析

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()
}