美文网首页
golang 系列:sync.Cond 机制

golang 系列:sync.Cond 机制

作者: lincoln_hlf1 | 来源:发表于2021-08-18 23:36 被阅读0次

前言

在 Go 里有专门为同步通信而生的 channel,所以较少看到 sync.Cond 的使用。不过它也是并发控制手段里的一种,今天我们就来认识下它的相关实现,加深对同步机制的运用。

sync.Cond

sync.Cond 提供了三个方法:Wait()、Signal()、Broadcast(),它们的用法如下:

  • Wait():阻塞当前的 goroutine,等待唤起。
  • Signal():唤起一个阻塞的 goroutine。
  • Broadcast():唤起所有阻塞的 goroutine。

通过上面的方法描述,我们就可以简单的实现一个任务池功能:先批量的创建 goroutine,然后调用 sync.Cond 的 Wait() 方法让其阻塞的等待。

当有一个任务到来时,则通过 Signal() 唤起刚刚在阻塞的某一个 goroutine,去执行任务。

通过任务池功能,我们发现 sync.Cond 的运用很简单,但 Go 官方并不推荐我们使用 sync.Cond 来实现协程间的同步通信

因为它并不符合 Go 官方 “通过通信来共享内存” 的设计思想,当场景复杂时,则会耦合各个业务功能。

sync.Cond 源码分析

我们来看下 sync.Cond 的结构体,代码在 /sr/sync/cond.go 下:

type Cond struct {
    noCopy noCopy       // 不可复制
    L Locker            // 锁
    notify  notifyList  // 通知唤起列表
    checker copyChecker // 复制检测
}

可以看到 Cond 上有 notify 列表,而这正是维护了需要唤起的 goroutine 列表。

当我们调用 Wait() 方法的时候就会维护当前 goroutine 到对应的 notifyList 里:

func (c *Cond) Wait() {
    c.checker.check()
    t := runtime_notifyListAdd(&c.notify) // 将当前 goroutine 添加到 notifyList 里
    c.L.Unlock()
    runtime_notifyListWait(&c.notify, t) // 阻塞等待
    c.L.Lock()
}

当有其他协程调用了 Signal 或 Broadcast 方法时,则会通过runtime_notifyListNotifyOneruntime_notifyListNotifyAll方法来唤起一个或多个 goroutine。

其他同步方式的实现

前面提到到 sync.Cond 并不被推荐作为协同通信手段,那如果要实现它的单播、广播效果,该怎么弄呢?

其实也很简单,如果我们要实现单播效果,那么只需要通过阻塞的监听 channel 信号即可。

如果要实现广播唤起效果,只需要利用 context 的链式取消特性,也能达到该效果。


感兴趣的朋友可以搜一搜公众号「 阅新技术 」,关注更多的推送文章。
可以的话,就顺便点个赞、留个言、分享下,感谢各位支持!
阅新技术,阅读更多的新知识。

相关文章

  • golang 系列:sync.Cond 机制

    前言 在 Go 里有专门为同步通信而生的 channel[https://mp.weixin.qq.com/s/o...

  • 【深度知识】Go语言:启动和内存分配初始化

    本文是 Golang 内部机制探索系列博客的后续。这个系列博客的目的是探索 Go 启动过程,这个过程也是理解 Go...

  • 解析Golang sync.Cond 条件变量源码

    使用场景 一个goroutine G1拿到锁,操作,其它多个goroutine等待G1 完事,需要通知其它多个go...

  • golang的垃圾回收(GC)机制

    请先阅读 golang的goroutine调度机制 golang的垃圾回收采用的是 标记-清理(Mark-and-...

  • 用 Go Plugin 构建模块化系统

    自从 golang 1.8以后,提供了一个 Plugin 的机制使得 golang能够加载 so 动态链接库文件。...

  • Go入门系列(一)伊始

    欢迎来到Golang入门系列,说起这个系列出现的缘由,1、Golang的潜力无疑;2、笔者希望把所有有价值的主流语...

  • golang 反射机制

    go语言也有反射机制,今天自学到go的反射,发现还是很值得记录一些这个知识点的。go语言它是通过 reflect ...

  • golang异常机制

    [toc] 前言 最近golang越来越火,自己的项目的后续项目也在陆续转成go语言,因为有着其他语言的基础,所以...

  • golang反射机制

    反射 反射就是程序能够在运行时动态的查看变量自己的所有属性和方法,能够调用他的任意方法和属性。 GO的反射基础是接...

  • golang sync.WaitGroup使用示例

    golang中同步方式 golang中有2种方式同步程序 一种使用channel 另一种使用锁机制。 sync.W...

网友评论

      本文标题:golang 系列:sync.Cond 机制

      本文链接:https://www.haomeiwen.com/subject/smonbltx.html