条件变量sync.Cond

未匹配的标注

如果是一个协程通知另一个协程的场景,用channel或者Mutex就可以。sync.Cond 经常用在多个 goroutine 等待,一个 goroutine 通知的场景,但是这个也能用close channel的方式实现。sync.Cond的好处是可以多次通知,而close channel做不到,更多的讨论可以看官方的issue。下面有个简单的demo展示sync.Cond的使用:

var done = false

func read(name string, c *sync.Cond) {
    for {
        c.L.Lock()
        c.Wait()
        if done {
            log.Println(name, "starts reading")
        }
        c.L.Unlock()
    }
}

func write(name string, c *sync.Cond) {
    log.Println(name, "starts writing")

    c.L.Lock()
    done = true
    c.L.Unlock()

    log.Println(name, "wakes all")
    c.Broadcast()
}

func main() {
    cond := sync.NewCond(&sync.Mutex{})

    go read("reader1", cond)
    go read("reader2", cond)
    go read("reader3", cond)
    write("writer", cond)
    write("writer", cond)

    time.Sleep(time.Second * 3)
}

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~