Go语言中的sync.WaitGroup详解

server/2025/1/11 11:37:16/

Go 语言作为一种现代并发编程语言,提供了强大的并发模型和工具。其中,sync.WaitGroup 是 Go 标准库中的一个重要同步工具,广泛用于协程(goroutine)的同步控制。本文将深入探讨 sync.WaitGroup 的工作原理、应用场景以及如何避免使用共享变量和信号量来实现同步。

一、sync.WaitGroup 简介

sync.WaitGroup 是 Go 标准库 sync 包中的一个类型,主要用于同步多个协程的执行。它的核心作用是允许主程序或其他协程等待一组协程完成任务后再继续执行。

1. 结构
type WaitGroup struct {noCopy noCopy      // 防止被复制state1 atomic.Uint64 // 用于原子操作的状态标志sema   uint32      // 用于阻塞和唤醒
}

WaitGroup 内部通过原子操作(atomic)和信号量(sema)实现协程的同步。

2. 核心方法
  • Add(delta int)
    增加或减少等待的任务数量(计数器)。

    • delta > 0:增加任务数。
    • delta < 0:减少任务数。
  • Done()


http://www.ppmy.cn/server/157451.html

相关文章

Springboot Rabbitmq + 线程池技术控制指定数量task执行

定义DataSyncTaskManager&#xff0c;作为线程池任务控制器 package org.demo.scheduletest.service;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueu…

【Linux】Linux开发:GDB调试器与Git版本控制工具指南

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建 在 Linux 开发中&#xff0c;GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题&#xff0c;G…

【学习笔记】数据结构(十二)

文件 文章目录 文件12.1 有关文件的基本概念12.2 顺序文件12.3 索引文件12.4 ISAM文件和VSAM文件12.4.1 ISAM文件12.4.2 VSAM文件 12.5 直接存取文件(散列文件)12.6 多关键字文件12.6.1 多重表文件12.6.2 倒排文件 12.1 有关文件的基本概念 文件(file) 是由大量性质相同的记录…

Ubuntu挂载Windows 磁盘,双系统

首先我们需要在终端输入这个命令&#xff0c;来查看磁盘分配情况 lsblk -f 找到需要挂载的磁盘&#xff0c;检查其类型&#xff08; 我的/dev/nvme2n1p1类型是ntfs&#xff0c;名字叫3500winData&#xff09; 然后新建一个挂载磁盘的目录&#xff0c;我的是/media/zeqi/3500wi…

了解SQL

目录 1、数据库基础 &#xff08;1&#xff09;数据库&#xff08;database&#xff09; &#xff08;2&#xff09;表&#xff08;table&#xff09;与模式&#xff08;schema&#xff09; &#xff08;3&#xff09;列和数据类型 &#xff08;4&#xff09;行 &#xff…

Win10微调大语言模型ChatGLM2-6B

在《Win10本地部署大语言模型ChatGLM2-6B-CSDN博客》基础上进行&#xff0c;官方文档在这里&#xff0c;参考了这篇文章 首先确保ChatGLM2-6B下的有ptuning AdvertiseGen下载地址1&#xff0c;地址2&#xff0c;文件中数据留几行 模型文件下载地址 &#xff08;注意&#xff1…

计算机网络期末复习(知识点)

概念题 在实际复习之前&#xff0c;可以看一下这个视频将网络知识串一下&#xff0c;以便更好地复习&#xff1a;【你管这破玩意叫网络&#xff1f;】 网络规模的分类 PAN&#xff08;个人区域网络&#xff09;&#xff1a;用于个人设备间的连接&#xff0c;如手机与蓝牙耳机…

redis的监控

1)查看key >keys * #查看所有的key,数据量大的时候容易阻塞 >scan 0 #每次获取11个key&#xff0c;直到获取所有的key,编号从0开始&#xff0c;下一次获取时&#xff0c;按照提示的编号输入scan后的值 当编号再次为0时&#xff0c;获取完成所有…