WaitGropu使用注意

作groutine参数时传指针

type WaitGroup struct {
noCopy noCopy // 64-bit value: high 32 bits are counter, low 32 bits are waiter count.
// 64-bit atomic operations require 64-bit alignment, but 32-bit
// compilers do not ensure it. So we allocate 12 bytes and then use
// the aligned 8 bytes in them as state, and the other 4 as storage
// for the sema.
state1 [3]uint32
}

WaitGroup 是结构体,传入使用值拷贝时,groutine内外是两个不同的WaitGroup,会造成逻辑混乱

var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int, wg *sync.WaitGroup) {
fmt.Println(i)
defer wg.Done()
}(i, &wg)
}
wg.Wait()

WaitGroup的Add要在goroutine前执行

var wg sync.WaitGroup
for i := 0; i < 10; i++ { go func(i int, wg *sync.WaitGroup) {
wg.Add(1)//应该在开始gorroutine之前调用wg.Add(1)来避免数据读写竞争
fmt.Println(i)
defer wg.Done()
}(i, &wg)
}
wg.Wait()

Add传入任意数字

var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1000)
go func(i int, wg *sync.WaitGroup) {
fmt.Println(i)
defer wg.Done()
}(i, &wg)
}
wg.Wait()

在使用上不会有什么问题,源码中根据输入的参数循环发送信号量;如果在高并发场景下会有性能问题;

WaitGroup的实现核心是 CAS使用

借用了CPU提供的原子性指令来实现。CAS操作修改共享变量时候不需要对共享变量加锁,而是通过类似乐观锁的方式进行检查,本质还是不断的占用CPU 资源换取加锁带来的开销(比如上下文切换开销)

sync.WaitGroup的更多相关文章

  1. Go并发控制之sync.WaitGroup

    WaitGroup 会将main goroutine阻塞直到所有的goroutine运行结束,从而达到并发控制的目的.使用方法非常简单,真心佩服创造Golang的大师们! type WaitGroup ...

  2. sync—WaitGroup

    用途:阻塞主线程的执行,直到所有的goroutine执行完成 WaitGroup总共有三个方法:Add(delta int),Done(),Wait().简单的说一下这三个方法的作用. Add:添加或 ...

  3. sync.WaitGroup和sync.Once

    sync.WaitGroup,顾名思义,等待一组goroutinue运行完毕.sync.WaitGroup声明后即可使用,它有如下方法: func (wg *WaitGroup) Add(delta ...

  4. golang 的 sync.WaitGroup

    WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成. 官方对它的说明如下: A WaitGroup waits for ...

  5. 《Go语言实战》笔记之协程同步 sync.WaitGroup

    原文地址(欢迎互换友链): http://www.niu12.com/article/8 sync 包提供同步 goroutine 的功能 <p>文档介绍</p><cod ...

  6. golang-----golang sync.WaitGroup解决goroutine同步

    go提供了sync包和channel来解决协程同步和通讯.新手对channel通道操作起来更容易产生死锁,如果时缓冲的channel还要考虑channel放入和取出数据的速率问题. 从字面就可以理解, ...

  7. golang sync.WaitGroup

    //阻塞,直到WaitGroup中的所以过程完成. import ( "fmt" "sync" ) func wgProcess(wg *sync.WaitGr ...

  8. Golang sync.WaitGroup的用法

    0x01 介绍 经常会看到以下了代码: 12345678910111213 package main import ( "fmt" "time") func m ...

  9. Golang的sync.WaitGroup 实现逻辑和源码解析

    在Golang中,WaitGroup主要用来做go Routine的等待,当启动多个go程序,通过waitgroup可以等待所有go程序结束后再执行后面的代码逻辑,比如: func Main() { ...

  10. golang的sync.WaitGroup使用示例

    下面一段代码 len(m) 不一定会打印为 10,为什么?.如果想要 len(m) 打印为 10,应该怎么修改代码? func main() { const N = 10 m := make(map[ ...

随机推荐

  1. 题解 【POJ3728】The merchant(LCA)

    题意:一棵树有N个城市,每个城市商品价格不一样,Q个询问,问从u出发到达v点,每个城市只能经过一次的最大利润 max min数组存u城到u的第2^i个祖先路径上的最值 答案就是u-v路径上的最大值-最 ...

  2. UE4大地图(流关卡、无缝地图)

    原作者:xiaosongfang 对于UE4来说我只是个菜鸟,研究一下网上的教程稍微尝试的做一下demo,所以可能下面会有描述不准确或者说没解释清的地方请多谅解哈.也非常欢迎指出我说的不对的地方一起学 ...

  3. vue input输入框关键字筛选检索列表数据展示

    想必大家在项目开发中难免会用到关键字筛选的功能,正好这次项目有需求要做这一块,就整理一下vue的input输入框输入关键字检索数据列表的代码.下面直接上代码: html: <!-- 筛选demo ...

  4. Cendos中启动docker失败的问题

    注:在 Windows中使用Linux虚拟机中使用Cendos 刚开始安装Docker时没有任何错误, 但是在后续的docker启动过程中, 出现以下问题: 按提示使用 systemctl statu ...

  5. FTP主动模式(Port)和被动模式(Passive)的区别

    1.FTP的PORT(主动模式): PORT中文称为主动模式,工作的原理: FTP客户端(1024以上端口)连接到FTP服务器的21端口,发送用户名和密码登录, 登录成功后要list列表或者读取数据时 ...

  6. System.Diagnostics.Process.Start(); 用法详解

    来源:https://news.68idc.cn/buildlang/ask/20150104156981.html 实例代码:http://www.cppcns.com/ruanjian/cshar ...

  7. Linux_CMD_FOR_OS_INFO

    1,系统版本 :  lsb_release -a 2,系统信息(86/64): uname -a 3,键盘信息:localectl status 4,系统支持的键盘:localectl list-ke ...

  8. stl算法汇总

  9. springcloud(二) - 服务调用Feign&openFeign

    功能介绍:动态代理的方式,简化请求其他服务的开发成本,更好得对请求地址组装.接受返回信息.返回参数解析等  Feign和OpenFeign区别: OpenFeign实现了Feign的基础功能,同时支持 ...

  10. 浪潮QQ群成员提取器 V2022

    浪潮QQ群成员提取软件 V2021 最新升级版 使用扫描安全登录QQ,批量获取群列表,然后在读取指定群的群成员列表支持过滤群主.群管理员 支持按最后发言时间提取活跃用户 支持识别僵尸粉和过滤可以导出文 ...