Go学习笔记 -- sync.Cond条件变量

简介

  sync.Cond 是基于互斥锁/读写锁实现的条件变量,用来协调想要访问共享资源的那些 Goroutine。当共享资源状态发生变化时,sync.Cond 可以用来通知等待条件发生而阻塞的 Goroutine

与互斥锁的关系

  首先,条件变量是基于互斥锁/读写锁实现的,条件变量的初始化离不开互斥锁。
  其次,互斥锁的目的是为了保护临界区和共享资源,而条件变量是为了协调想要访问这些共享资源的协程。

使用场景

我可以使用条件变量来实现生产者消费者场景等。
如下:

import (
	"fmt"
	"sync"
	"time"
)

var stage = 0
var lock sync.Mutex
var pCond = sync.NewCond(&lock) //等待生产的条件变量
var cCond = sync.NewCond(&lock) //等待消费的条件变量

func produce() {
	pCond.L.Lock() //先获取条件变量中的锁
	defer pCond.L.Unlock()//使用defer函数在方法执行完之后解锁
	for stage == 1 { //使用 for 判断当前条件是否需要等待,避免假唤醒,当有商品时,不生产。
		pCond.Wait()//等待商品被消费后的通知
	}
	//正常生产商品
	stage = 1
	fmt.Println("生产成功")
	//通知消费者消费
	cCond.Signal()//唤醒最靠前的一个协程
}

func consume() {
	cCond.L.Lock()
	for stage == 0 {
		cCond.Wait()
	}
	//正常消费商品
	stage = 0
	fmt.Println("消费成功")
	cCond.L.Unlock()
	//通知生产者生产
	pCond.Signal() 
}

func main() {
	count := 5
	for i := 0; i < count; i++ {
		go consume()
		go produce()
	}
	time.Sleep(time.Millisecond * 1000)
}
----------------------------------
生产成功
消费成功
生产成功
消费成功
生产成功
消费成功
生产成功
消费成功
生产成功
消费成功

Signal 和 Boardcast 的区别

首先,cond.Wait() 会将当前协程添加到通知队伍的队尾,当使用 Signal 唤醒等待的协程时,只能唤醒队伍首部的协程。
而使用 Boardcast 会唤醒所有等待的协程。

注意事项

  1. Wait方法需要在它基于的互斥锁保护下执行,否则就会引发不可恢复的 panic,所以我们在调用该方法之前需要先获取其基于的互斥锁。
  2. SignalBoardcast 方法不需要受到互斥锁的保护,而且最好不要在解锁互斥锁之前调用这两个方法。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这是一个OLS回归结果汇总表,其中包含了回归模型的基本信息、拟合度、系数、显著性检验等多个指标。具体解读如下: - Dep. Variable:因变量为y。 - R-squared:拟合优度为0.049,即模型能够解释因变量变异的4.9%。 - Adj. R-squared:根据自变量数量进行调整后的拟合优度为0.036,说明模型的解释能力有限。 - F-statistic:F值为3.581,对应的P值为0.0305,说明模型具有一定的显著性。 - Prob (F-statistic):F检验的P值为0.0305,小于通常的显著性水平0.05,说明回归模型在总体上是显著的。 - const、x1、x2:分别是截距项和自变量的回归系数。 - t:t值表示系数是否显著,P>|t|表示对应的双侧检验的P值。 - [0.025 0.975]:系数的置信区间,如果包含了0则说明系数不显著。 - Omnibus:Omnibus值为86.169,对应的P值为0.000,说明残差不服从正态分布。 - Durbin-Watson:Durbin-Watson值为2.062,说明残差之间存在自相关性。 - Prob(Omnibus):Omnibus检验的P值为0.000,小于0.05,说明残差不服从正态分布。 - Jarque-Bera (JB):JB值为394.216,对应的P值为2.50e-86,说明残差不服从正态分布。 - Skew:Skew值为2.304,说明残差呈现严重的正偏态分布。 - Kurtosis:Kurtosis值为9.772,说明残差呈现严重的峰态分布。 - Cond. No.:条件数为2.31e+03,说明模型存在较强的多重共线性或者其他数值问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mingvvv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值