Go语言同步原语与数据竞争:WaitGroup

在Go语言并发编程中,我们经常需要等待多个 goroutine 执行完毕后再继续下一步操作。Go 提供的 sync.WaitGroup 就是专为这种**“等待一组任务完成”**而设计的同步原语。


一、基本原理

sync.WaitGroup 提供三个主要方法:

方法说明
Add(n int)设置等待的 goroutine 数量(加计数)
Done()每个 goroutine 完成时调用(减计数)
Wait()阻塞主 goroutine,直到计数归零

它内部使用计数器+条件变量,当所有 goroutine 都调用 Done() 后,Wait() 才会解除阻塞。


二、典型用法

示例:等待 10 个 goroutine 执行完毕
package mainimport ("fmt""sync"
)func worker(id int, wg *sync.WaitGroup) {defer wg.Done() // 每个 goroutine 完成时调用fmt.Printf("Worker %d is working...\n", id)// 模拟工作
}func main() {var wg sync.WaitGroupfor i := 1; i <= 10; i++ {wg.Add(1) // 每启动一个 goroutine,加1go worker(i, &wg)}wg.Wait() // 阻塞直到所有 goroutine 完成fmt.Println("All workers done.")
}

输出示意:

Worker 1 is working...
Worker 2 is working...
...
All workers done.

三、常见错误及注意事项

1. Add() 必须在 goroutine 启动前调用

错误示例:

go func() {wg.Add(1) // 此时 goroutine 可能已开始执行,竞态风险...
}()

正确做法:

wg.Add(1)
go func() {...wg.Done()
}()
2. 不可重复使用已完成的 WaitGroup(没有“重置”功能)

WaitGroup 设计为一次性同步器,不建议重复使用,若确需控制并发次数,可用 sync.Pool 或 semaphore 替代。


四、结合匿名函数使用

for i := 0; i < 5; i++ {wg.Add(1)go func(i int) {defer wg.Done()fmt.Println("i:", i)}(i)
}
wg.Wait()

⚠️ 注意:传参 i 必须显式传入闭包,避免捕获变量陷阱。


五、使用场景

  • • 等待一组任务执行完成(如:并发下载、批量计算)
  • • 控制主函数在 goroutine 完成后再退出
  • • 可搭配 Channel 和 Context 使用,实现更复杂的并发控制模型

六、小结

  • • sync.WaitGroup 是 Go 并发编程中最常用的同步工具之一。
  • • 使用 Add/Done/Wait 实现多协程间的同步等待。
  • • 使用时避免竞态和变量捕获问题。

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

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

相关文章

Java单体架构 vs 分布式架构

Java单体架构 vs 分布式架构 在电商系统开发中&#xff0c;当用户量从几百激增到百万级&#xff0c;你的架构是否还能从容应对&#xff1f;一次代码更新是否意味着整个系统停机&#xff1f;今天我们就来拆解Java架构设计的核心命题&#xff1a;单体还是分布式&#xff1f; 一、…

day40- 硬件学习之 51单片机II (中断处理)

一、独立按键的使用 main.c key.c key.h 二、中断处理 2.1 定义 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。 当CPU正在处理某件事的时候外界发生了紧急事件请求&#xff0c;要求CPU暂停当前的工作&#xff0c;转而去处理这个紧急事件&#xff0c;处理完以…

机器学习:开启智能时代的大门

一、引言 机器学习&#xff08;Machine Learning&#xff09;正成为人工智能的核心技术。从 Netflix 推荐电影&#xff0c;到银行识别欺诈交易&#xff0c;机器学习正在逐渐改变世界。本篇文章将从理论到实操全面介绍机器学习的基础概念&#xff0c;并附有代码和案例。 二、什…

几个重要的行列式 线性代数

目录 1.主&#xff08;副&#xff09;对角线行列式 2 拉普拉斯展开式 3 范德蒙德行列式 对于行列式的计算来说&#xff0c;一般给出的行列式我们都要对其进行化简&#xff0c;但是化简到什么程度就可以了呢&#xff1f; 这就是本篇的用处&#xff0c;一般给出的行列式化简的…

答辩讲解387基于Spring Boot的心理健康管理系统

摘 要 视频地址 答辩讲解387基于Spring Boot的心理健康管理系统_哔哩哔哩_bilibili 自改革开放政策施行以来&#xff0c;我国经济持续保持快速增长态势&#xff0c;国民生活水平得到了明显提升&#xff0c;然而近些年来&#xff0c;经济增速出现放缓&#xff0c;再加上疫情等…

使用WinUSB读写USB设备

参考&#xff1a;使用WinUSB读写USB设备 - USB中文网

DECOUPLING REPRESENTATION AND CLASSIFIER FOR LONG-TAILED RECOGNITION

摘要 在本文中&#xff0c;我们将学习过程解耦为表征学习和分类&#xff0c;系统地探究不同的平衡策略如何对长尾识别产生影响。研究结果令人惊讶&#xff1a;&#xff08;1&#xff09;数据不平衡在学习高质量表征时可能并非问题&#xff1b;&#xff08;2&#xff09;通过最…

如何使用joomla5缓存来加速网页加载速度

Joomla 有多种缓存“内容”的方式。我们将以两个角色来介绍和使用缓存&#xff0c;在这篇将以普通管理员的视角来概述——缓存什么、在哪里缓存以及何时缓存。 什么是Joomla 缓存cacha 作为管理员&#xff0c;Joomla 为您提供了缓存网站内容的能力。您可以选择缓存整个网页或…

《我们的十年》电影联合品宣品牌白碧美:自然与科技共融

破界新生&#xff0c;定义东方美肤高度 湖南白碧美生物科技有限公司&#xff0c;扎根中国创新活力之都——星城长沙&#xff0c;是以“科技赋能美肤”为核心的高端轻奢护肤品牌。秉承“自然与科技共融”的品牌哲学&#xff0c;白碧美将千年东方草本植萃智慧与现代尖端生物科技…

B树与B+树:数据库索引背后的秘密

B-tree&#xff08;B树&#xff09;和Btree&#xff08;B树&#xff09;是两种高效的多叉树数据结构&#xff0c;专为磁盘存储系统优化设计&#xff0c;广泛应用于数据库和文件系统的索引。以下是两者的核心特点及区别&#xff1a; ⚙️ 一、B-tree&#xff08;B树&#xff09;…

欧洲宇航局如何为航天员提供虚拟现实训练内容

通过身临其境的模拟&#xff0c;宇航员可以完善他们在太空行走中执行的每一个动作&#xff0c;以确保更好地准备前往国际空间站、月球和其他地方执行任务。 VR/XR技术在宇航员训练中的优势&#xff1a; 提高安全性:复杂或危险程序的无风险实践 成本和资源节约:减少对实体模型、…

打卡Day53

知识点&#xff1a; 1.对抗生成网络的思想&#xff1a;关注损失从何而来 2.生成器、判别器 3.nn.sequential容器&#xff1a;适合于按顺序运算的情况&#xff0c;简化前向传播写法 4.leakyReLU介绍&#xff1a;避免relu的神经元失活现象 ps&#xff1a;如果你学有余力&#xf…

【Three.js】机器人管线包模拟

机器人管线包模拟 背景技术选型效果视频效果截图 最近在工业数字化项目中尝试用Three.js实现了一个机器人管线包的3D可视化模拟系统&#xff0c;记录一下开发过程和技术要点&#xff0c;希望能给同样在探索Web3D技术的同学一些灵感。 背景 管线包&#xff08;Dress Pack&…

微軟將開始使用 Copilot Vision 監控 Windows 10 和 11 用戶的螢幕

這對於提供幫助是必要的&#xff0c;美國用戶已經可以欣賞這項創新。 微軟為其AI助理Copilot添加了新的Vision功能&#xff0c;使其能夠即時分析用戶螢幕上發生的事情並幫助解決當前的問題。 根據該公司介紹&#xff0c;Copilot Vision 能夠捕捉使用者所見內容&#xff0c;並可…

多模态大语言模型arxiv论文略读(123)

Enhancing Advanced Visual Reasoning Ability of Large Language Models ➡️ 论文标题&#xff1a;Enhancing Advanced Visual Reasoning Ability of Large Language Models ➡️ 论文作者&#xff1a;Zhiyuan Li, Dongnan Liu, Chaoyi Zhang, Heng Wang, Tengfei Xue, Weid…

【linux】Linux vs Android

文章目录 1、联系2、区别3、核心差异4、应用场景对比5、未来发展趋势6、参考附录——GNU 都说Android就是个装了UI的Linux&#xff0c;可到底和Linux有什么关系呢&#xff1f; 1、联系 内核基础 共享Linux内核&#xff1a;安卓基于Linux内核构建&#xff0c;继承了Linux的进程…

台积电(TSMC)工艺库命名规则

以标准单元库tcb_n12ffcll_bwp_6t_20_p96_cpd_lvt_tt0p8v25c_hm_lvf_p_ccs举例说明台积电工艺库命名规则。 文件名分段解析 字段含义补充说明tcbTSMC标准单元库(TCBN = TSMC Cell Library, Base Node)通常用于标识基础标准单元库,区别于IO库(tciobn)或模拟库(tcap)。n1…

飞算 JavaAI 模块化生成:重构效率与体验的双重升级

在 Java 老项目重构场景中&#xff0c;代码生成的颗粒度与可控性直接影响开发效率。飞算 JavaAI 创新推出的模块化智能生成机制&#xff0c;支持按接口、按模块粒度触发源码生成&#xff0c;通过任务拆解与渐进式交付模式&#xff0c;为开发者提供更灵活的重构节奏控制&#xf…

硬件-DAY02(按键、中断、定时器、蜂鸣器)

补充&#xff1a;1.变量前加code&#xff0c;从RAM区变成ROM区 2.三极管的原理就是PN结 3.裸机程序是单线程的&#xff0c;display时不能delay 一、独立按键 1.高电平没按&#xff0c;低电平按了 按键原理&#xff1a;轮询方式&#xff08;poll&#xff09;-->以消耗大量CP…

前端页面html开发案例入门实践、超链接标签、图片标签、常用站点

前端页面html开发案例入门实践 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>html案例</title> </head> <body><h1>web前端开发</h1><h2>HTML</h2><…