sync.WaitGroup
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的更多相关文章
- Go并发控制之sync.WaitGroup
WaitGroup 会将main goroutine阻塞直到所有的goroutine运行结束,从而达到并发控制的目的.使用方法非常简单,真心佩服创造Golang的大师们! type WaitGroup ...
- sync—WaitGroup
用途:阻塞主线程的执行,直到所有的goroutine执行完成 WaitGroup总共有三个方法:Add(delta int),Done(),Wait().简单的说一下这三个方法的作用. Add:添加或 ...
- sync.WaitGroup和sync.Once
sync.WaitGroup,顾名思义,等待一组goroutinue运行完毕.sync.WaitGroup声明后即可使用,它有如下方法: func (wg *WaitGroup) Add(delta ...
- golang 的 sync.WaitGroup
WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成. 官方对它的说明如下: A WaitGroup waits for ...
- 《Go语言实战》笔记之协程同步 sync.WaitGroup
原文地址(欢迎互换友链): http://www.niu12.com/article/8 sync 包提供同步 goroutine 的功能 <p>文档介绍</p><cod ...
- golang-----golang sync.WaitGroup解决goroutine同步
go提供了sync包和channel来解决协程同步和通讯.新手对channel通道操作起来更容易产生死锁,如果时缓冲的channel还要考虑channel放入和取出数据的速率问题. 从字面就可以理解, ...
- golang sync.WaitGroup
//阻塞,直到WaitGroup中的所以过程完成. import ( "fmt" "sync" ) func wgProcess(wg *sync.WaitGr ...
- Golang sync.WaitGroup的用法
0x01 介绍 经常会看到以下了代码: 12345678910111213 package main import ( "fmt" "time") func m ...
- Golang的sync.WaitGroup 实现逻辑和源码解析
在Golang中,WaitGroup主要用来做go Routine的等待,当启动多个go程序,通过waitgroup可以等待所有go程序结束后再执行后面的代码逻辑,比如: func Main() { ...
- golang的sync.WaitGroup使用示例
下面一段代码 len(m) 不一定会打印为 10,为什么?.如果想要 len(m) 打印为 10,应该怎么修改代码? func main() { const N = 10 m := make(map[ ...
随机推荐
- Flink Table API & SQL 自定义Redis Sink 代码实现
在自定义source&sink这一块官方给的说明并不是很多,需要去看源代码熟悉,自己实现一个redis sink主要需要实现StreamTableSinkFactory,RichSinkFun ...
- sxt_(011_014)_显示添加书籍
一.数据库设计 create table book( bookid int auto_increment primary key, bookname varchar(16), bookprice do ...
- mysql学习问题解决
1.字符串转时间格式函数: STR_TO_DATE('2017-10-19 16:47:00', '%Y-%m-%d %H:%i:%s') oracle的为to_date 2.specified tw ...
- npm i error:0909006C:PEM routines:get_name:no start line 遇到问题解决
找了大半天的问题,结果是有个httpd的线程开机自动启动,把端口占用了
- oralce sql 缓存查询及删除
--缓存查询语句 V$SQLAREA 视图记录sql 执行情况(加载次数/用时/Id....) 常用字段 ADDRESS:SQL语句在SGA中的地址. 这两列被用于鉴别SQL语句,有时,两条不同的语句 ...
- python日志篇-基础版
对常用python日志语法做记录,方便以后重复使用 print内容记录到文件: #!/usr/bin/env python # -*- coding: utf-8 -*- ##____________ ...
- 实验1task3
<实验结论> #include <stdio.h> #include <stdlib.h> int main() { int a, b, t; a = 3; b = ...
- 蓝桥杯训练赛二-问题 B
字符串的输入输出处理. 输入 第一行是一个正整数N,最大为100.之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000. 输出 先将输入中的前N行字符串(可能含有空格)原样 ...
- 什么是axios
原文: https://blog.csdn.net/qq_40837310/article/details/123028044 1.使用格式和jquery的ajax很相似,和最初的相比可以链式调用,1 ...
- 关于osqp
看了osqp的英文概要,记录如下: 1.采用交替方向乘子法 2.通过因式分解高速缓冲和热启动可以减少运算时间 3.适合嵌入式系统,实测mpc在10ms之内,路径规划在20ms左右(少障碍物),障碍物多 ...