7

Go语言之Cond

 2 years ago
source link: https://studygolang.com/articles/25600?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Go语言之Cond

ZhDavis · 2019-12-25 13:03:52 · 2537 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-12-25 13:03:52 的文章,其中的信息可能已经有所发展或是发生改变。

转自公众号:灰子学技术

原文链接:https://mp.weixin.qq.com/s/9FjBJVhRBVSBV4CVpCfChg

Golang的sync包中的Cond实现了一种条件变量,主要用来解决多个读协程等待共享资源变成ready的场景。在使用Cond的时候,需要特别注意下:每个Cond都会关联一个Lock(*sync.Mutex or *sync.RWMutex),当修改条件或者调用Wait方法时,必须加锁,保护condition

1. Cond的介绍:

定义如下所示:

1240

1240

Cond相关API介绍, Cond主要有三个函数构成,Broadcast(), Signal(), Wait()。

1.1. Broadcast()

用来唤醒所有的处于等待c状态的协程,如果没有等待的协程,该函数也不会报错。

备注:使用该函数时,可以不加锁,也可以加锁,原因是该函数没有修改操作。

1240

1.2. Signal()

通知单个等待c状态的协程,让它继续执行,如果此时有多个协程处于等待状态,会从等待列表中取出最开始等待的那个协程,来接收消息。

备注:使用该函数时,也可以不加锁,原因1.1 所示。

1240

1.3. Wait()

主要由四步构成:

Unlock()->

阻塞等待通知(即等待Signal()或Broadcast()的通知)->

收到通知->

Lock()

该函数在被调用之后,在没有收到Signal或者Broadcast的通知之前,协程处于阻塞状态。

备注:使用这个函数的时候,一定要加锁。

1240

2. 例子

2.1. broadcast与wait配合的例子

1240

结果分析:通过输出结果我们可以看出,处于wait状态的协程0和1,在收到broadcast之后,都会继续执行后续操作。

2.2 . signal与wait配合的例子

1240

结果分析:通过输出结果可以看出,第一个signal触发的时候,就算已经有2个协程在wait状态,但是wait状态中的最开始等待的协程0会被先调用。

等到第二个sinal被触发之后,处于等待状态的协程1才会被调用。

参考文档:

https://ieevee.com/tech/2019/06/15/cond.html

https://golang.org/pkg/sync/#Cond

https://cyent.github.io/golang/goroutine/sync_cond/

灰子学技术:

1240


有疑问加站长微信联系(非本文作者)

280

Recommend

  • 30
    • www.tuicool.com 5 years ago
    • Cache

    Go cond 源码学习

    概述 cond是go语言sync提供的条件变量,通过cond可以让一系列的goroutine在触发某个条件时才被唤醒。每一个cond结构体都包含一个锁L。cond提供了三个方法: Signal:调用Signal之后可以唤醒单个goroutine。...

  • 18
    • blog.danieljanus.pl 5 years ago
    • Cache

    Indenting cond forms

    Indentation matters when reading Clojure code. It is the primary visual cue that helps the reader discern the code structure. Most Clojure code seen in the wild conforms to either the

  • 18
    • studygolang.com 4 years ago
    • Cache

    sync.Cond学习笔记

    sync.Cond go/sync sync.Cond用于goroutine之间的协作,用于协程的挂起和唤醒。当多个协程之间协作时,有可能一个协程需要依赖别的协程完成后再进行某种操作,这时可依据管道进行通信,这对于两个协程之间是比较方便...

  • 7
    • studygolang.com 4 years ago
    • Cache

    Golang sync库--Cond

    Golang sync库--Cond MontyOak · 大约15小时之前 · 42 次点击 · 预计阅读时间 3 分钟 · 不到1分钟之前 开始浏览     ...

  • 7

    sync.Cond 条件变量是 Golang 标准库 sync 包中的一个常用类。sync.Cond 往往被用在一个或一组 goroutine 等待某个条件成立后唤醒这样的场景,例如常见的生产者消费者场景。 本文将基于

  • 5
    • arxiv.org 3 years ago
    • Cache

    cond-mat

    [Submitted on 2 May 2001] Freezing in Ising Ferromagnets Download PDF We investigate the final state...

  • 6
    • segmentfault.com 3 years ago
    • Cache

    golang 系列:sync.Cond 机制

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

  • 5
    • segmentfault.com 3 years ago
    • Cache

    一文读懂 Go sync.Cond 设计

    Go 语言通过 go 关键字开启 goroutine 让开发者可以轻松地实现并发编程,而并发程序的有效运行,往往离不开 sync 包的保驾护航。目前,sync 包的赋能列表包括: sync.atomic 下的原子操作、sync.Map 并发安全 map、

  • 5
    • xiusin.github.io 2 years ago
    • Cache

    sync.cond条件锁

    sync.cond条件锁 | 修心修己 山不向我来,我便向它去,若一去不回,便一去不回。 Powered by xiusin | RSS...

  • 10

    pthread_mutex_t & pthread_cond_t 总结 一、多线程并发 1.1 多线程并发引起的问题 我们先来看如下代码: #in...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK