news 2026/4/17 16:13:47

Golang WaitGroup 踩坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Golang WaitGroup 踩坑

在Go语言中,sync.WaitGroup(简称WaitGroup)是用于多goroutine同步的核心机制,但其使用需谨慎,否则可能导致程序卡顿、死锁或数据竞争等问题。以下是关键踩坑点及解决方案:

  1. ‌未启动单独goroutine导致主线程阻塞‌
    ‌问题‌:若WaitGroup未在goroutine内调用,主线程可能因等待子任务完成而阻塞。
    ‌解决方案‌:确保WaitGroup操作在独立goroutine中执行:
varwg sync.WaitGroup wg.Add(1)gofunc(){deferwg.Done()// 子任务逻辑}()wg.Wait()// 主线程等待子任务完成
  1. ‌计数器操作顺序错误‌
    ‌问题‌:Add(n)应在goroutine启动前调用,否则可能导致Wait()提前返回。
    ‌解决方案‌:遵循Add() -> 启动goroutine -> Done()的顺序:
wg.Add(1)// 增加计数器gofunc(){deferwg.Done()// 任务结束时减少计数器// 任务逻辑}()
  1. ‌闭包变量捕获问题‌
    ‌问题‌:从循环启动goroutine时,若闭包捕获循环变量(如for循环中的i),可能导致所有goroutine共享同一变量值。
    ‌解决方案‌:通过参数传递循环变量值:
fori:=0;i<5;i++{wg.Add(1)gofunc(numint){// 传递参数deferwg.Done()fmt.Println("Goroutine",num)}(i)// 传递当前i值}
  1. ‌未正确传递指针导致计数器失效‌
    问题‌:将WaitGroup作为值传递给函数时,子函数操作的是副本,主函数计数器不变。
    解决方案‌:传递指针引用:
funcworker(wg*sync.WaitGroup){deferwg.Done()// 任务逻辑}wg.Add(1)worker(&wg)// 传递指针
  1. ‌未调用Done()导致死锁‌
    问题‌:若goroutine未调用Done(),计数器永远不会归零,Wait()将永久阻塞。
    解决方案‌:确保每个goroutine结束前调用Done():
gofunc(){deferwg.Done()// 确保Done()在return前执行// 任务逻辑}()
  1. ‌并发场景下的资源泄漏‌
    ‌问题‌:若WaitGroup未正确管理goroutine生命周期,可能导致资源泄漏。
    ‌解决方案‌:结合context实现超时控制:
ctx,cancel:=context.WithTimeout(context.Background(),1*time.Second)defercancel()gofunc(ctx context.Context){select{case<-ctx.Done():return// 超时退出case<-time.After(2*time.Second):// 任务逻辑}}(ctx)

示例代码

varwg sync.WaitGroup wg.Add(1)gofunc(){deferwg.Done()time.Sleep(1*time.Second)fmt.Println("Task completed")}()wg.Wait()// 等待任务完成

WaitGroup是Go并发编程的基石,但需严格遵循计数器操作顺序和闭包变量传递规则,避免常见陷阱。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:31:54

国产CI/CD工具崛起:Gitee如何在智能交付时代脱颖而出?

国产CI/CD工具崛起&#xff1a;Gitee如何在智能交付时代脱颖而出&#xff1f; 随着数字化转型浪潮席卷全球&#xff0c;软件开发领域正在经历一场效率革命。持续集成与持续交付&#xff08;CI/CD&#xff09;已成为现代软件工程不可或缺的基础设施&#xff0c;它能够将代码变更…

作者头像 李华
网站建设 2026/4/18 7:54:04

若依自定义后端接口404踩坑记录

博主在后端自定义了接口&#xff1a;PostMapping("/upload")public AjaxResult upload(RequestPart("file") MultipartFile file,RequestParam("studentId") String studentId,RequestParam("thesisTitle") String thesisTitle,Reques…

作者头像 李华
网站建设 2026/4/18 5:17:59

DBdoctor SQL审核,首家信通院满分通过!

近日&#xff0c;数据库性能诊断DBdoctor&#xff0c;已顺利通过中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;《大数据结构化查询语言(SQL)质量管理平台能力分级要求》的专项能力评估&#xff0c;荣获最高等级——“先进级”认证。尤为重要的是&#xff…

作者头像 李华
网站建设 2026/4/18 1:52:15

以孝为根,立德成人

今天下午&#xff0c;我参加了慈明学校家长会&#xff0c;我内心感慨万千&#xff0c;特此写下感悟与大家分享。当班主任在屏幕上投射出《孝亲之法》中“孝亲是孩子做人的德根”这句话时&#xff0c;我的心被轻轻触动。恰好在今天中午&#xff0c;我刚陪公婆吃过饭&#xff0c;…

作者头像 李华
网站建设 2026/4/17 17:13:38

18、深入理解 MTD 子系统:原理、配置与分区管理

深入理解 MTD 子系统:原理、配置与分区管理 在现代嵌入式系统中,对各类存储设备的高效管理至关重要。MTD(Memory Technology Devices)子系统应运而生,旨在支持如闪存芯片等多种类存储设备。本文将深入探讨 MTD 子系统的相关知识,包括其启用、基本操作、分区管理等内容。…

作者头像 李华
网站建设 2026/4/17 16:18:46

23、Linux开发工具全解析:从代码浏览到问题排查

Linux开发工具全解析:从代码浏览到问题排查 在Linux开发过程中,有许多工具可以帮助开发者更高效地进行代码浏览、调试和性能分析。本文将介绍一些常用的工具,包括 cbrowser/cscope 、跟踪和分析工具等,帮助你更好地理解和使用这些工具。 1. cbrowser/cscope工具 cbrow…

作者头像 李华