2-6.sync.Cond

sync.Cond 是 Go 语言对条件锁的实现。它可以让一组 Goroutine 在不满足条件时阻塞等待,满足条件时被唤醒。

结构体

内嵌了 Locker 接口(一般用 Mutex 结构作为 Locker 就可以),和一个链表作为等待者队列。

type Cond struct {
    noCopy  noCopy       // 用于保证结构体不会在编译期间拷贝
    checker copyChecker  // 用于禁止运行期间发生的拷贝
    L       Locker       // 接口,需要实现 Lock 和 Unlock 方法,一般使用 Mutex 作为 Locker 即可
    notify  notifyList   // 等待的协程链表
}

// 这个 wait 和 notify 字段是只增不减的,相当于自增ID。不是很理解为什么有链表了还需要索引
type notifyList struct {
    wait uint32     // 正在等待的协程索引
    notify uint32   // 已经通知到的协程索引

    lock mutex
    head *sudog
    tail *sudog
}

使用方法

这个程序会在1秒后输出10个 "listen"

接口

对外提供三个接口:Wait(), Signal() 与 Broadcast()

Wait()

Wait() 方法会释放当前协程拿到的锁,并将当前协程放到等待者队列里

Signal() 与 Broadcast()

Signal()Broadcast() 就是用来唤醒陷入休眠的 Goroutine 的方法

  • Signal() 方法会唤醒队列最前面的协程

  • Broadcast() 方法会唤醒队列中全部的协程

小结

sync.Condarrow-up-right 不是一个常用的同步机制,但是在条件长时间无法满足时,与使用 for {} 进行忙碌等待相比,sync.Condarrow-up-right 能够让出处理器的使用权,提高 CPU 的利用率。使用时我们也需要注意以下问题:

Last updated