news 2026/6/8 21:46:16

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/6/4 1:45:38

四轮轮毂电机驱动车辆稳定性控制实战手记

四轮轮毂电机驱动车辆直接横摆力矩控制(DYC)&#xff0c;转矩矢量分配(TVC)的仿真搭建和控制整体采用分层控制策略。 其中顶层控制器的任务是利用车辆状态信息、横摆角速度以及质心侧偏角的误差计算出维持车辆稳定性的期望附加横摆力矩。 为了减少车辆速度影响&#xff0c;设计…

作者头像 李华
网站建设 2026/6/7 23:19:24

2025机器狗公司综合实力排行榜公布,智元AGIBOT强势“夺冠”

当前&#xff0c;机器狗&#xff0c;即四足智能机器人产业呈现出三个明显的发展趋势&#xff1a;一是技术集成度不断提升&#xff0c;AI算法与硬件系统的融合更加深入&#xff1b;二是应用场景不断拓展&#xff0c;从工业领域向公共安全、应急救援、科研教育等多元化领域延伸&a…

作者头像 李华
网站建设 2026/6/7 23:52:39

AI智能抠图工具:一键去除图片背景的精准解决方案

在电商设计、内容创作与视觉营销领域&#xff0c;高效处理图片背景是提升工作效率的关键环节。本网站基于深度学习算法与计算机视觉技术&#xff0c;提供自动化背景去除服务&#xff0c;支持复杂场景下的精准识别与边缘优化&#xff0c;助力用户快速获取透明背景或自定义背景的…

作者头像 李华
网站建设 2026/6/8 7:29:33

24、嵌入式开发中的二进制工具及调试技巧

嵌入式开发中的二进制工具及调试技巧 在嵌入式开发中,二进制工具(binutils)是工具链的关键组成部分。要构建编译器,首先得成功构建这些二进制工具。下面将介绍一些嵌入式开发者需要了解的实用工具。 1. 常用二进制工具介绍 1.1 readelf readelf 工具用于检查目标 ELF 二…

作者头像 李华
网站建设 2026/6/8 1:39:53

28、Linux 调试与移植全解析

Linux 调试与移植全解析 1. 多任务调试 在处理多线程执行时,开发者通常会遇到两种不同的调试场景。进程可以拥有自己独立的地址空间,也可以与其他执行线程共享地址空间(以及其他系统资源)。对于不共享公共地址空间的独立进程,必须使用单独的独立调试会话进行调试。我们可…

作者头像 李华
网站建设 2026/5/31 18:36:06

S速度曲线点动测试_PLC-Recoder录波仿真

一、前言 与西门子PLC通信可支持实体PLC和仿真PLC,其中高级仿真advanced可直接与recoder软件通信,但是plcsim普通仿真则需要使用netToplcsim软件桥接,可参考下文。本文使用plcsim advanced测试 二、PLC-recoder软件参数配置 1.配置PLC通信通道,可新增通道与所需PLC资源通…

作者头像 李华