Go语言中的条件变量Cond
一、条件变量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相关推荐
- Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型
如题,使用条件变量Cond和channel通道实现多个生产者和消费者模型.Go语言天生带有C语言的基因,很多东西和C与很像,但是用起来 绝对比C语言方便.今天用Go语言来实现下多消费者和生产者模型.如 ...
- golang中的条件变量
简介 var mailbox uint8 var lock sync.RWMutex sendCond := sync.NewCond(&lock) recvCond := sync.NewC ...
- linux条件变量cond,Linux C 条件变量cond的使用记录
条件变量是实现线程间同步的一种方法,条件变量用来自动阻塞一个线程,直到收到收到一个cond信号或其它特殊情况发送,条件变量使用的时候必须与互斥量同时使用,这是为了保证条件量在线程间操作的"原 ...
- Linux之线程条件变量cond
概念:条件变量不是锁,要和互斥量组合使用.条件变量就是生产者"生产"完成,消费者才能"使用",如果没有"产品",消费者就会被条件变量cond ...
- linux中的条件变量的使用
什么是条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制. 主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立"(给 ...
- python中可以使用变量来引用函数吗_如何在python语言中使用函数变量并调用函数...
在python语言中,除了常规变量之外,还有函数变量.把函数本身赋值给变量,这个变量为函数变量. 工具/原料 python pycharm 截图工具 WPS 方法/步骤 1 在已新建的python文件 ...
- python以下是变量合法命名的是_Python语言中以下哪个变量的命名是错误的
[单选题]雨篷.阳台计量不正确的是( ) . [单选题]关于补体活化的MBL途径,哪项是错误的? [单选题]关于楼地面垫层的计量规则,描述错误的是( ). [单选题]根据<建设工程工程畺清单计价 ...
- 在SQL存储过程中给条件变量加上单引号
在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) set @wher ...
- c语言结构体成员变量私有化,C语言中结构体变量私有化详解
C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...
最新文章
- 【Linux】一步一步学Linux——ps命令(119)
- 跨平台(Android, iOS, WP, HTML5)游戏开发libGDX学习教程
- 虚拟空间独立服务器哪个好,共享虚拟主机和独立哪个好
- 基于TableStore构建简易海量Topic消息队列
- UI设计加载动效趋势|可以认真学习临摹的素材模板
- 机器视觉中的图像采集卡
- 腾讯信鸽推送,部分手机不能接收到推送弹窗
- opengl魔方文档_基于OpenGL的3D旋转魔方的实现.doc
- 单相电能量计算机公式,电能与电压电流的关系及计算公式详解
- 腾讯云 python接口_Python 服务端集成 腾讯云 IM 服务
- 深度优先和广度优先算法
- IDEA 奇淫 插件
- python中sub函数用法_Python pandas.DataFrame.sub函数方法的使用
- OpenHarmony WLAN HDI 源码学习
- 用pageOffice插件实现 word文档在线填充指定数据
- 【图像去噪】基于自适应小波阙值算法实现图像去噪附matlab代码
- 当你的才华撑不起你的野心的时候,你就应该努力
- Nodejs内存溢出原因
- Metaq的一些简单机制
- logstash的lumberjack协议解析
热门文章
- Eatting外卖基于瑞吉外卖代码全功能优化含源码
- 为什么很多人会觉得FPGA难学?
- 工业互联网产业链全景图深度分析
- oracle drop tablespace 恢复杀手锏
- java 几分钟前几小时前几天前后转化为时间
- Generating Images from Captions with Attention
- text to image(一):《GENERATING IMAGES FROM CAPTIONS WITH ATTENTION》
- 南柯服务器压力,性能/负载/压力测试 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- 直流输电模型基于pscad仿真软件的3端直流输电模型
- Hexo-Matery主题细致美化