一、条件变量Cond的定义

  • Go语言里的条件变量,是一个结构体,它包括对应的方法和属性字段。
  • Cond实现了⼀个条件变量,⼀个线程集合地,供线程等待或者宣布某事件的发⽣。
  • 每个Cond实例都有⼀个相关的锁(⼀般是*Mutex或 *RWMutex类型的值),它必须在改变条件时或者调⽤Wait⽅法时保持锁定。 Cond可以创建为其他结构体的字段, Cond在开始使⽤后不能被拷⻉。 条件变量:sync.Cond,多个goroutine等待或接受通知的集合地。
  • 原型
    type Cond struct {
        noCopy noCopy
        L Lock
        notify notifyList
        checker copyChecker
    }

二、Cond里的方法

  • func NewCond(l Locker) *Cond
    使⽤锁 I 创建一个 *Cond。 Cond条件变量,总是要和锁结合使用。
  • func (c *Cond) Broadcast()
    Broadcast唤醒所有等待c的线程。调⽤者在调⽤本⽅法时,建议(但并⾮必须)保持c.L的锁定。
  • func (c *Cond) Signal()
    Signal唤醒等待c的⼀个线程(如果存在)。调⽤者在调⽤本⽅法时,建议(但并⾮必须)保持c.L的锁定。 发送通知给⼀个⼈。
  • func (c *Cond) Wait()
    a) Wait⾃⾏解锁c.L并阻塞当前线程,在之后线程恢复执⾏时, Wait⽅法会在返回前锁定c.L。和其他系统不同, Wait除⾮被Broadcast或者Signal唤醒,不会主动返回。 ⼴播给所有⼈。
    b) 因为线程中Wait⽅法是第⼀个恢复执⾏的,⽽此时c.L未加锁。调⽤者不应假设Wait恢复时条件已满⾜,相反,调⽤者应在循环中等待。

    案例1. 条件变量的使用
//myCondDes.go

// myCondDes project main.go
package mainimport ("fmt""sync""time"
)func main() {var mutex sync.Mutexcond := sync.Cond{L: &mutex}condition := falsego func() {time.Sleep(1 * time.Second)cond.L.Lock()fmt.Println("子goroutine已经锁定...")fmt.Println("子goroutine更改条件数值,并发送通知...")condition = true //更改数值cond.Signal()    //发送通知:一个goroutinefmt.Println("子goroutine...继续...")time.Sleep(5 * time.Second)fmt.Println("子goroutine已经解锁!")cond.L.Unlock()}()cond.L.Lock()fmt.Println("main 已经锁定...")if !condition {fmt.Println("main 即将等待...")//1.wait尝试解锁//2.等待-->当前的goroutine进入阻塞状态,等待被唤醒: signal(), broadcast()//3.一旦被唤醒后,又被锁定cond.Wait()fmt.Println("main 被唤醒...")}fmt.Println("main 继续")fmt.Println("main 解锁...")cond.L.Unlock()time.Sleep(3 * time.Second)
}

    效果如下:

图(1) 条件变量的使用

Go语言中的条件变量Cond相关推荐

  1. Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型

    如题,使用条件变量Cond和channel通道实现多个生产者和消费者模型.Go语言天生带有C语言的基因,很多东西和C与很像,但是用起来 绝对比C语言方便.今天用Go语言来实现下多消费者和生产者模型.如 ...

  2. golang中的条件变量

    简介 var mailbox uint8 var lock sync.RWMutex sendCond := sync.NewCond(&lock) recvCond := sync.NewC ...

  3. linux条件变量cond,Linux C 条件变量cond的使用记录

    条件变量是实现线程间同步的一种方法,条件变量用来自动阻塞一个线程,直到收到收到一个cond信号或其它特殊情况发送,条件变量使用的时候必须与互斥量同时使用,这是为了保证条件量在线程间操作的"原 ...

  4. Linux之线程条件变量cond

    概念:条件变量不是锁,要和互斥量组合使用.条件变量就是生产者"生产"完成,消费者才能"使用",如果没有"产品",消费者就会被条件变量cond ...

  5. linux中的条件变量的使用

    什么是条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制. 主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立"(给 ...

  6. python中可以使用变量来引用函数吗_如何在python语言中使用函数变量并调用函数...

    在python语言中,除了常规变量之外,还有函数变量.把函数本身赋值给变量,这个变量为函数变量. 工具/原料 python pycharm 截图工具 WPS 方法/步骤 1 在已新建的python文件 ...

  7. python以下是变量合法命名的是_Python语言中以下哪个变量的命名是错误的

    [单选题]雨篷.阳台计量不正确的是( ) . [单选题]关于补体活化的MBL途径,哪项是错误的? [单选题]关于楼地面垫层的计量规则,描述错误的是( ). [单选题]根据<建设工程工程畺清单计价 ...

  8. 在SQL存储过程中给条件变量加上单引号

    在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) set @wher ...

  9. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

最新文章

  1. 【Linux】一步一步学Linux——ps命令(119)
  2. 跨平台(Android, iOS, WP, HTML5)游戏开发libGDX学习教程
  3. 虚拟空间独立服务器哪个好,共享虚拟主机和独立哪个好
  4. 基于TableStore构建简易海量Topic消息队列
  5. UI设计加载动效趋势|可以认真学习临摹的素材模板
  6. 机器视觉中的图像采集卡
  7. 腾讯信鸽推送,部分手机不能接收到推送弹窗
  8. opengl魔方文档_基于OpenGL的3D旋转魔方的实现.doc
  9. 单相电能量计算机公式,电能与电压电流的关系及计算公式详解
  10. 腾讯云 python接口_Python 服务端集成 腾讯云 IM 服务
  11. 深度优先和广度优先算法
  12. IDEA 奇淫 插件
  13. python中sub函数用法_Python pandas.DataFrame.sub函数方法的使用
  14. OpenHarmony WLAN HDI 源码学习
  15. 用pageOffice插件实现 word文档在线填充指定数据
  16. 【图像去噪】基于自适应小波阙值算法实现图像去噪附matlab代码
  17. 当你的才华撑不起你的野心的时候,你就应该努力
  18. Nodejs内存溢出原因
  19. Metaq的一些简单机制
  20. logstash的lumberjack协议解析

热门文章

  1. Eatting外卖基于瑞吉外卖代码全功能优化含源码
  2. 为什么很多人会觉得FPGA难学?
  3. 工业互联网产业链全景图深度分析
  4. oracle drop tablespace 恢复杀手锏
  5. java 几分钟前几小时前几天前后转化为时间
  6. Generating Images from Captions with Attention
  7. text to image(一):《GENERATING IMAGES FROM CAPTIONS WITH ATTENTION》
  8. 南柯服务器压力,性能/负载/压力测试 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  9. 直流输电模型基于pscad仿真软件的3端直流输电模型
  10. Hexo-Matery主题细致美化