sync.WaitGroup
2024-10-22 07:38:37
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 资源换取加锁带来的开销(比如上下文切换开销)
最新文章
- python 第一章学习课程
- Kali Linux 秘籍/Web渗透秘籍/无线渗透入门
- ASP.NET 系列:单元测试
- ibatis批量操作补充
- 渐进记号 Asymptotic Notations-------geeksforgeeks 翻译
- A Guide to Creating a Quality Project Schedule
- IOS多线程之NSThread
- 最大流之sap算法
- clone()方法、深复制和浅复制
- JS之ONLoad事件
- 1083: [SCOI2005]繁忙的都市
- python并发编程之线程(一):线程&;守护线程&;全局解释器锁
- virtualization - Ubuntu Budgie screen distortion in Hyper-V - Ask Ubuntu
- python websocket网页实时显示远程服务器日志信息
- 编写自己的SpringBoot-starter
- MVC 上传下载
- python的学习之路day6
- ios backgroundColor
- Cout<;<;XXX<;<;<;XXX<;<;<;XXX,是从左到右计算的
- Swift进阶之路(一)——单例模式、属性传值、代理传值、闭包传值
热门文章
- 【实验】VUE依赖版本,遇到就看这里
- 找vector最大最小《转载》
- vmware15 nat模式下虚拟机能够ping通宿主机,宿主机无法平通虚拟机,nat网卡地址为192.168.0.1,网关为192.168.0.2.
- P12证书转BKS证书
- Python学习笔记(一)环境确认
- ptyhon基础课程_2
- EXE项目和DLL项目远程调试、Props设置说明
- 在线访问GET/POST及格式化json工具
- macOS NSScrollView简单使用
- BIP去掉弹框中的参照的新增按钮