记使用WaitGroup时的一个错误
记使用WaitGroup时的一个错误
近期重构我之前写的server代码时,不当使用了WaitGroup,碰到了个错误,记录下.
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(1)
f1 := func() {
time.Sleep(time.Second * 2)
fmt.Println("func()")
wg.Done()
}
go f1()
go f1()
go f1()
wg.Wait()
fmt.Println("Done")
}
/*
D:\test\>go run testwg2.go
func()
func()
panic: sync: negative WaitGroup counter
goroutine 22 [running]:
runtime.panic(0x4a56e0, 0xc082000250)
c:/go/src/pkg/runtime/panic.c:279 +0x11f
sync.(*WaitGroup).Add(0xc0820045e0, 0xffffffffffffffff)
c:/go/src/pkg/sync/waitgroup.go:64 +0x9a
sync.(*WaitGroup).Done(0xc0820045e0)
c:/go/src/pkg/sync/waitgroup.go:82 +0x37
main.func路001()
D:/test/testwg2.go:17 +0xd2
created by main.main
D:/test/testwg2.go:22 +0x9a
*/
出现的错误: panic: sync: negative WaitGroup counter
关于这个错误, stackoverflow有个相关问题的链接.
还有一个错误:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(10)
f1 := func() {
time.Sleep(time.Second * 2)
fmt.Println("func()")
wg.Done()
}
go f1()
go f1()
go f1()
wg.Wait()
fmt.Println("Done")
}
/*
D:\test\>go run testwg2.go
func()
func()
func()
fatal error: all goroutines are asleep - deadlock!
goroutine 16 [semacquire]:
sync.runtime_Semacquire(0xc0820001bc)
c:/go/src/pkg/runtime/sema.goc:199 +0x37
sync.(*WaitGroup).Wait(0xc0820045e0)
c:/go/src/pkg/sync/waitgroup.go:129 +0x152
main.main()
D:/test/testwg2.go:24 +0xaa
goroutine 19 [finalizer wait]:
runtime.park(0x414db0, 0x55ec80, 0x55d689)
c:/go/src/pkg/runtime/proc.c:1369 +0xac
runtime.parkunlock(0x55ec80, 0x55d689)
c:/go/src/pkg/runtime/proc.c:1385 +0x42
runfinq()
c:/go/src/pkg/runtime/mgc0.c:2644 +0xdd
runtime.goexit()
c:/go/src/pkg/runtime/proc.c:1445
exit status 2
*/
事实上这些错误主要是当时wg的add与done由于一些原因分开处理了。
而
中间由于穿插了一大堆处理。一直done造成wg负数了,如例1,或者add
与done造成了deadlock。
以后实际处理中要注意下。尽量降低中间处理。把这样的需相应的简洁化处理.
只是近期重构server蛮爽的。经过大遍大遍的清理代码,梳理流程后。
代码看着顺眼了非常多。
只是还是任重而道远。
BLOG: blog.csdn.net/xcl168
记使用WaitGroup时的一个错误的更多相关文章
- 路由器安装ubuntu-16.04.1-server-amd64出现“无法安装busybox-initramfs”错误。向目标系统中安装busybox-initramfs软件包时出现一个错误。请检查/var/log/syslog或查看第四虚拟控制台以获得详细
公司的路由器要ubuntu服务器进行路由网络功能的管理,在安装的时候出现下面的错误提示: 安装ubuntu-16.04.1-server-amd64出现“无法安装busybox-initramfs”错 ...
- windows Server 2012/2016 路由和远程访问,PPPOE,ADSL,连接接口时出现一个错误,连接被远程计算机终止
经过查询资料,是由mprddm.dll的bug引起的. 修改位置: 将je修改为jmp. 查找修改位置,可参考 前面的RasGetPortUserData的调用,或者 后面的 字符串 64位dll可使 ...
- windows网卡共享网络时,报Internet连接共享访问被启用时,出现了一个错误。(null)
今天笔者在自己电脑上作试验时,准备将无线网络连接共享给VMnet1时报Internet连接共享访问被启用时,出现了一个错误.(null)错误: 经上网查询到问题原因:没有启用 Windows Fire ...
- python运行selenium时出现的一个错误总结
1.SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 场景:运用pan ...
- 【SD系列】SAP 查看销售订单时,报了一个错误消息,“项目不符合计划行(程序错误)”
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP 查看销售订单时,报了一个错误 ...
- 配置Java环境变量时的一个常见错误
我们在把JDK路径配置为环境变量时,有一个常用的配置方法,就是把JDK根路径配置为"JAVA_HOME"值,然后在Path中添加一条"%JAVA_HOME%\bin&qu ...
- C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...
- [转]在 .NET 中远程请求 https 内容时,发生错误:根据验证过程,远程证书无效
该文原网址:http://www.cnblogs.com/xwgli/p/5487930.html 在 .NET 中远程请求 https 内容时,发生错误:根据验证过程,远程证书无效. 当访问 h ...
- 编译php时出现xsl错误的解决方法
是因为系统没安装一个叫 libxslt-devel 的包, 安装上就好了. 附编译php时的常见错误: http://www.myhack58.com/Article/sort099/sort0102 ...
随机推荐
- 【BZOJ4034】T2(树链剖分)
题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...
- UML学习倒腾记
先看到http://www.jianshu.com/p/1256e2643923这篇博客,号称21分钟入门uml,也许是我太笨了吧,一下午也没有完全搞定: 使用过atom编辑器,没有完全运行出来结果. ...
- java中线程切换的开销
思路: 开三个线程A,B,C 线程A不断的调用LockSupport.park()阻塞自己,一旦发现自己被唤醒,调用Thread.interrupted()清除interrupt标记位,同时增加自增计 ...
- 51nod 1201 整数划分
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 DP转移方程:dp[i][j] = dp[i-j][j]+dp[i ...
- Spring Tool Suite(STS)安装
Spring Tool Suite是一个基于Eclipse的开发环境,可以自定义用于开发Spring应用程序.它提供了一个随时可用的环境来实现,调试,运行和部署Spring应用程序,包括Pivotal ...
- linux下kill某个应用
linux命令行与桌面切换快捷键Ctr+Alt+F1,Ctr+Alt+F7 ps -e | grep abc sudo kill xyz
- Parameter Binding in ASP.NET Web API #Reprinted
http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
- 品质与合身 无须昂贵 | Tailorwoods在线男装定制
品质与合身 无须昂贵 | Tailorwoods在线男装定制 北京市朝阳区姚家园北一路八月照相馆2F
- SQL 列转行与行转列
假设有张学生成绩表(tb)如下:Name Subject Result张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94*/ -------------- ...
- 字符串(NSString)及常见字符串处理函数
从本系列文章的开始,我们就使用过字符串对象,但是我们却还没有比较详细的介绍过它.使用@符,再一对双引号将一组字符串引用起来,例如: @”In fact, Objective-C is very sim ...