当前位置:首页 > 科技  > 软件

使用 sync.Cond 来协调并发 goroutine 的访问共享资源

来源: 责编: 时间:2023-11-28 09:33:25 318观看
导读使用 sync.Cond 解决并发访问共享资源问题在并发编程中,当多个 goroutine 需要访问共享资源时,我们需要使用一些机制来协调它们的执行顺序,以避免竞态条件和数据不一致的问题。在 Go 语言中,sync.Cond 条件变量就是一种常

使用 sync.Cond 解决并发访问共享资源问题

在并发编程中,当多个 goroutine 需要访问共享资源时,我们需要使用一些机制来协调它们的执行顺序,以避免竞态条件和数据不一致的问题。在 Go 语言中,sync.Cond 条件变量就是一种常用的机制,它可以用来等待和通知其他 goroutine。aEd28资讯网——每日最新资讯28at.com

sync.Cond 和互斥锁的区别

互斥锁(sync.Mutex)用于保护临界区和共享资源,而 sync.Cond 则用于协调多个 goroutine 的执行顺序。互斥锁只能一个 goroutine 持有锁,其他 goroutine 必须等待锁被释放才能继续执行。而 sync.Cond 可以让等待的 goroutine 在条件满足时被唤醒,进而继续执行。aEd28资讯网——每日最新资讯28at.com

sync.Cond 的四个方法

sync.Cond 的定义如下:aEd28资讯网——每日最新资讯28at.com

// Each Cond has an associated Locker L (often a *Mutex or *RWMutex),// which must be held when changing the condition and// when calling the Wait method.//// A Cond must not be copied after first use.type Cond struct {        noCopy noCopy        // L is held while observing or changing the condition        L Locker        notify  notifyList        checker copyChecker}

每个 Cond 实例都会关联一个锁 L(互斥锁 *Mutex,或读写锁 *RWMutex),当修改条件或者调用 Wait 方法时,必须加锁。aEd28资讯网——每日最新资讯28at.com

1. NewCond 创建实例

func NewCond(l Locker) *Cond

NewCond 方法用于创建一个 Cond 实例,并关联一个锁(互斥锁或读写锁)。aEd28资讯网——每日最新资讯28at.com

2. Broadcast 广播唤醒所有等待的 goroutine

// Broadcast wakes all goroutines waiting on c.//// It is allowed but not required for the caller to hold c.L// during the call.func (c *Cond) Broadcast()

Broadcast 方法用于唤醒所有等待条件变量 c 的 goroutine。它不需要持有锁来调用。aEd28资讯网——每日最新资讯28at.com

3. Signal 唤醒一个等待的 goroutine

// Signal wakes one goroutine waiting on c, if there is any.//// It is allowed but not required for the caller to hold c.L// during the call.func (c *Cond) Signal()

Signal 方法用于唤醒一个等待条件变量 c 的 goroutine。它不需要持有锁来调用。aEd28资讯网——每日最新资讯28at.com

4. Wait 等待条件变量满足

// Wait atomically unlocks c.L and suspends execution// of the calling goroutine. After later resuming execution,// Wait locks c.L before returning. Unlike in other systems,// Wait cannot return unless awoken by Broadcast or Signal.//// Because c.L is not locked when Wait first resumes, the caller// typically cannot assume that the condition is true when// Wait returns. Instead, the caller should Wait in a loop:////    c.L.Lock()//    for !condition() {//        c.Wait()//    }//    ... make use of condition ...//    c.L.Unlock()//func (c *Cond) Wait()

Wait 方法会自动释放锁,并挂起当前的 goroutine,直到条件变量 c 被 Broadcast 或 Signal 唤醒。被唤醒后,Wait 方法会重新获得锁,并继续执行后续的代码。aEd28资讯网——每日最新资讯28at.com

使用示例

下面是一个使用 sync.Cond 的示例,实现了一个简单的读写同步机制:aEd28资讯网——每日最新资讯28at.com

package mainimport (    "fmt"    "sync"    "time")var done = falsefunc read(str string, c *sync.Cond) {    c.L.Lock()    for !done {        c.Wait()    }    fmt.Println(str, "start reading")    c.L.Unlock()}func write(str string, c *sync.Cond) {    fmt.Println(str, "start writing")    time.Sleep(2 * time.Second)    c.L.Lock()    done = true    c.L.Unlock()    fmt.Println(str, "wake up all")    c.Broadcast()}func main() {    m := &sync.Mutex{}    c := sync.NewCond(m)    go read("reader1", c)    go read("reader2", c)    write("writer", c)    time.Sleep(5 * time.Second)}

在这个示例中,有两个读取协程(reader1 和 reader2)和一个写入协程(writer)。写入协程在执行后会通知所有等待的读取协程,读取协程在条件满足时才能开始读取。aEd28资讯网——每日最新资讯28at.com

输出结果如下:aEd28资讯网——每日最新资讯28at.com

writer start writingwriter wake up allreader2 start readingreader1 start reading

通过使用 sync.Cond,我们可以很方便地实现多个 goroutine 之间的等待和通知机制,从而更好地协调并发访问共享资源的执行顺序。aEd28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-34582-0.html使用 sync.Cond 来协调并发 goroutine 的访问共享资源

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何高效地使用Goroutine,你学会了?

下一篇: Spring到底是如何解决循环依赖问题的?​

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • 三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
Top