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 资源换取加锁带来的开销(比如上下文切换开销)

最新文章

  1. python 第一章学习课程
  2. Kali Linux 秘籍/Web渗透秘籍/无线渗透入门
  3. ASP.NET 系列:单元测试
  4. ibatis批量操作补充
  5. 渐进记号 Asymptotic Notations-------geeksforgeeks 翻译
  6. A Guide to Creating a Quality Project Schedule
  7. IOS多线程之NSThread
  8. 最大流之sap算法
  9. clone()方法、深复制和浅复制
  10. JS之ONLoad事件
  11. 1083: [SCOI2005]繁忙的都市
  12. python并发编程之线程(一):线程&amp;守护线程&amp;全局解释器锁
  13. virtualization - Ubuntu Budgie screen distortion in Hyper-V - Ask Ubuntu
  14. python websocket网页实时显示远程服务器日志信息
  15. 编写自己的SpringBoot-starter
  16. MVC 上传下载
  17. python的学习之路day6
  18. ios backgroundColor
  19. Cout&lt;&lt;XXX&lt;&lt;&lt;XXX&lt;&lt;&lt;XXX,是从左到右计算的
  20. Swift进阶之路(一)——单例模式、属性传值、代理传值、闭包传值

热门文章

  1. 【实验】VUE依赖版本,遇到就看这里
  2. 找vector最大最小《转载》
  3. vmware15 nat模式下虚拟机能够ping通宿主机,宿主机无法平通虚拟机,nat网卡地址为192.168.0.1,网关为192.168.0.2.
  4. P12证书转BKS证书
  5. Python学习笔记(一)环境确认
  6. ptyhon基础课程_2
  7. EXE项目和DLL项目远程调试、Props设置说明
  8. 在线访问GET/POST及格式化json工具
  9. macOS NSScrollView简单使用
  10. BIP去掉弹框中的参照的新增按钮