Go语言中的条件变量:sync.NewCond

news2024/11/23 16:42:20

在并发编程中,我们经常需要在多个goroutine之间同步操作,特别是当某些操作需要等待特定条件发生时。Go语言的sync包提供了一个强大的同步原语——条件变量(Cond),它允许我们等待或通知某个条件的变化。

sync.NewCond

sync.NewCond函数用于创建一个新的条件变量,并将其与一个互斥锁(sync.Mutexsync.RWMutex)关联。这个条件变量可以用来挂起和唤醒goroutine,以便在满足特定条件时协调它们的执行。

条件变量的方法

  • L:条件变量关联的互斥锁。
  • Wait():当前goroutine在调用此方法后会被挂起,直到被SignalBroadcast唤醒。
  • Signal():唤醒一个等待条件变量的goroutine(如果有的话)。
  • Broadcast():唤醒所有等待条件变量的goroutine。

示例代码

下面是一个使用sync.NewCond的示例,模拟了一个比赛场景,其中10个选手需要等待一个开始信号才能开始比赛。

package main

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

func main() {
	race()
}

// race 函数模拟了一个比赛场景,10个选手等待一个信号开始比赛
func race() {
	// 创建一个条件变量和互斥锁
	cond := sync.NewCond(&sync.Mutex{})
	// 创建一个等待组,用于等待所有选手完成比赛
	var wg sync.WaitGroup
	// 初始化等待组,添加11个任务(10个选手 + 1个发令员)
	wg.Add(11)

	// 启动10个选手的goroutine
	for i := 0; i < 10; i++ {
		go func(num int) {
			// 选手完成后,将等待组计数器减一
			defer wg.Done()
			// 打印选手就位信息
			fmt.Println(num, "号已经就位")
			// 选手获取互斥锁,准备等待信号
			cond.L.Lock()
			// 选手等待条件变量的信号
			cond.Wait()
			// 打印选手开始工作的信息
			fmt.Println(num, "号已开始工作")
			// 选手释放互斥锁
			cond.L.Unlock()
		}(i)
	}

	// 等待2秒,模拟比赛准备时间
	time.Sleep(2 * time.Second)

	// 启动一个goroutine,用于发送比赛开始的信号
	go func() {
		// 完成后,将等待组计数器减一
		defer wg.Done()
		// 打印准备开始的信息
		fmt.Println("准备开始!")
		// 发送广播信号,通知所有等待的选手开始比赛
		cond.Broadcast()
	}()

	// 等待所有选手完成比赛
	wg.Wait()
}

工作原理

在这个示例中,我们首先创建了一个条件变量cond,并将其与一个新的sync.Mutex关联。然后,我们启动了10个goroutine来模拟选手,每个选手在就位后会调用cond.Wait()来挂起自己。这会导致它们释放互斥锁并等待信号。

主goroutine等待2秒钟后,启动一个发令员goroutine,它调用cond.Broadcast()来唤醒所有等待的选手。当选手们被唤醒后,它们会重新获取互斥锁,打印开始工作的信息,然后释放互斥锁。

应用场景

条件变量非常适合用于需要等待特定事件或条件发生的场景,例如:

  • 生产者-消费者问题,消费者等待生产者生产数据。
  • 信号量控制,限制同时访问某个资源的goroutine数量。
  • 任何需要在多个goroutine之间同步执行的场景。

总结

sync.NewCond是Go语言中一个非常实用的同步原语,它提供了一种简单而有效的方式来协调多个goroutine的执行。通过使用条件变量,我们可以编写出更加灵活和高效的并发程序。在处理复杂的并发问题时,sync.NewCond是一个不可或缺的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TSmaster Measurement setup(测量设置)

文章目录 1、Measurement setup功能介绍2、数据流过滤3、Measurement Filter 测量过滤器3.1 插入过滤器3.2 设置过滤数据3.3 过滤条件的失能3.4 窗口缩放 1、Measurement setup功能介绍 Measurement setup 窗体主要包含三个功能&#xff1a; 提供一个面板&#xff0c;用户能够…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作HUD Camera以及让两个相机同时渲染屏幕二、制作HUD Canvas 1.制作法力条Soul Orb引入库2.制作生命条Health读入数据3.制作吉欧统计数Geo Counter4.制作…

万字长文解析Golang高性能内存缓存库BigCache

项目地址 BigCache 是一个快速&#xff0c;支持并发访问&#xff0c;自淘汰的内存型缓存&#xff0c;可以在存储大量元素时依然保持高性能。BigCache将元素保存在堆上却避免了GC的开销。 背景介绍 BigCache的作者在项目里遇到了如下的需求&#xff1a; 支持http协议支持 10…

vulfocus在线靶场:骑士cms_cve_2020_35339:latest 速通手册

目录 一、启动环境&#xff0c;访问页面&#xff0c;ip:端口号/index.php?madmin,进入后台管理页面&#xff0c;账号密码都是adminadmin 二、进入之后&#xff0c;根据图片所示&#xff0c;地址后追加一下代码&#xff0c;保存修改 ​三、新开标签页访问&#xff1a;①ip:端…

【数据结构】归并排序 —— 递归及非递归解决归并排序

归并排序 一、归并排序1、归并排序的思想2、归并排序代码实现&#xff08;递归&#xff09;<1> 归并排序的递归区间<2> 归并排序的稳定性<3> 拷贝 3、归并排序代码实现&#xff08;非递归&#xff09;<1> 循环区间溢出问题 二、总结 一、归并排序 1、…

Java技术复习提升 10异常

10 异常 10.1异常介绍及分类 异常捕获 选中后alttabt->选中try-catch 异常就是程序执行中不正常的情况 注意语法和逻辑错误并不是异常 异常分类有两种 error和exception error是错误 虚拟机无法解决的严重问题 exception是其他因为编程错误或者外在因素导致的一般性的问…

transformer.js(三):底层架构及性能优化指南

Transformer.js 是一个轻量级、功能强大的 JavaScript 库&#xff0c;专注于在浏览器中运行 Transformer 模型&#xff0c;为前端开发者提供了高效实现自然语言处理&#xff08;NLP&#xff09;任务的能力。本文将详细解析 Transformer.js 的底层架构&#xff0c;并提供实用的性…

HCIA笔记3--TCP-UDP-交换机工作原理

1. tcp协议 可靠的连接 1.1 报文格式 1.2 三次握手 1.3 四次挥手 为什么TIME_WAIT需要2MSL的等待时间&#xff1f; &#xff08;a&#xff09; 为了实现可靠的关闭 &#xff08;b&#xff09;为了让过期的报文在网络上消失 对于(a), 假设host发给server的last ack丢了。 ser…

[Redis#2] 定义 | 使用场景 | 安装教程 | 快!

目录 1. 定义 In-memory data structures 在内存中存储数据 2. 优点&#xff01;快 Programmability 可编程性 Extensibility 扩展性 Persistence 持久化 Clustering 分布式集群 High availability 高可用性 ⭕快速访问的实现 3. 使用场景 1.Real-time data store …

Dubbo源码解析-服务调用(七)

一、服务调用流程 服务在订阅过程中&#xff0c;把notify 过来的urls 都转成了invoker&#xff0c;不知道大家是否还记得前面的rpc 过程&#xff0c;protocol也是在服务端和消费端各连接子一个invoker&#xff0c;如下图&#xff1a; 这张图主要展示rpc 主流程&#xff0c;消费…

Postman之newman

系列文章目录 1.Postman之安装及汉化基本使用介绍 2.Postman之变量操作 3.Postman之数据提取 4.Postman之pm.test断言操作 5.Postman之newman Postman之newman 1.基础环境node安装1.1.配置环境变量1.2.安装newman和html报告组件 2.newman运行 newman可以理解为&#xff0c;没有…

shell脚本(五)

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

人口老龄化社区服务|基于springboot+vue的人口老龄化社区服务与管理平台(源码+数据库+文档)

目录 基于springbootvue的人口老龄化社区服务与管理平台 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff0c;阿里云…

初识WGCLOUD - 监测磁盘空间还能使用多久

WGCLOUD是一款免费开源的运维监控软件&#xff0c;性能优秀&#xff0c;部署简单&#xff0c;轻巧使用&#xff0c;支持大部分的Linux和Windows、安卓、MacOS等平台安装部署 最近发布的新版本 v3.5.4&#xff0c;WGCLOUD新增了可以自动计算每个磁盘剩余空间的可使用天数&#x…

Linux各种并发服务器优缺点

本文旨在介绍针对“无并发C/S模型”改进的方法总结以及各种改进方法的优缺点&#xff0c;具体函数的实现并不介绍。 1. 无并发C/S模型 创建服务器流程分析&#xff1a; socket()创建服务器的监听套接字bind()将服务器给服务器的监听套接字绑定IP地址和Port端口号listen()设置…

【PPTist】添加PPT模版

前言&#xff1a;这篇文章来探索一下如何应用其他的PPT模版&#xff0c;给一个下拉菜单&#xff0c;列出几个项目中内置的模版 PPT模版数据 &#xff08;一&#xff09;增加菜单项 首先在下面这个菜单中增加一个“切换模版”的菜单项&#xff0c;点击之后在弹出框中显示所有的…

【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)

【Python PyTorch】卷积神经网络 CNN&#xff08;LeNet-5网络&#xff09; 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…

如何用通义灵码助力项目开发 | OceanBase obdiag 项目共建实践

本文来自 obdiag 项目共建的用户分享 一、背景 我的数据库探索之旅始于OceanBase。作为一位满怀好奇心的DBA&#xff0c;我内心始终怀揣着对数据库内部运作机制的无尽向往。开源如同一把钥匙&#xff0c;为我们这些求知欲旺盛的“好奇猫”解锁了通往新知的神秘大门。在众多分布…

如何给 Apache 新站点目录配置 SELinux ?

在 web 服务器管理领域&#xff0c;确保服务器环境的安全性至关重要。SELinux (Security-Enhanced Linux) 是保护 Linux 服务器最有效的工具之一&#xff0c;它是一种强制访问控制 (MAC mandatory access control) 安全机制。当使用最流行的 web 服务器 Apache 提供 web 内容时…

【电子物证培训】龙信助力三明市公安局电子物证取证竞赛

文章关键词&#xff1a;电子数据取证、手机取证、电子物证、介质取证 为了进一步提升福建省三明市公安机关刑侦部门在电子物证领域的专业技能&#xff0c;强化队伍实战能力&#xff0c;三明市公安机关刑侦部门举办电子物证专业技能竞赛&#xff0c;龙信受邀为竞赛提供全方位的…