记使用WaitGroup时的一个错误
来源:互联网 发布:好易网络电视tv版下载 编辑:程序博客网 时间:2024/05/16 07:33
记使用WaitGroup时的一个错误
最近重构我之前写的服务器代码时,不当使用了WaitGroup,碰到了个错误,记录下.
package mainimport ( "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.gofunc()func()panic: sync: negative WaitGroup countergoroutine 22 [running]:runtime.panic(0x4a56e0, 0xc082000250) c:/go/src/pkg/runtime/panic.c:279 +0x11fsync.(*WaitGroup).Add(0xc0820045e0, 0xffffffffffffffff) c:/go/src/pkg/sync/waitgroup.go:64 +0x9async.(*WaitGroup).Done(0xc0820045e0) c:/go/src/pkg/sync/waitgroup.go:82 +0x37main.func路001() D:/test/testwg2.go:17 +0xd2created by main.main D:/test/testwg2.go:22 +0x9a*/
出现的错误: panic: sync: negative WaitGroup counter
关于这个错误, stackoverflow有个相关问题的链接.
另一个错误:
package mainimport ( "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.gofunc()func()func()fatal error: all goroutines are asleep - deadlock!goroutine 16 [semacquire]:sync.runtime_Semacquire(0xc0820001bc) c:/go/src/pkg/runtime/sema.goc:199 +0x37sync.(*WaitGroup).Wait(0xc0820045e0) c:/go/src/pkg/sync/waitgroup.go:129 +0x152main.main() D:/test/testwg2.go:24 +0xaagoroutine 19 [finalizer wait]:runtime.park(0x414db0, 0x55ec80, 0x55d689) c:/go/src/pkg/runtime/proc.c:1369 +0xacruntime.parkunlock(0x55ec80, 0x55d689) c:/go/src/pkg/runtime/proc.c:1385 +0x42runfinq() c:/go/src/pkg/runtime/mgc0.c:2644 +0xddruntime.goexit() c:/go/src/pkg/runtime/proc.c:1445exit status 2*/
其实这些错误主要是当时wg的add与done因为一些原因分开处理了。而
中间因为穿插了一大堆处理,一直done造成wg负数了,如例1,或者add
与done造成了deadlock。
以后实际处理中要注意下,尽量减少中间处理,把这种需对应的简洁化处理.
不过最近重构服务器蛮爽的,经过大遍大遍的清理代码,梳理流程后。
代码看着顺眼了很多。不过还是任重而道远。
BLOG: blog.csdn.net/xcl168
0 0
- 记使用WaitGroup时的一个错误
- sync.WaitGroup的错误用法与纠正
- GoLang WaitGroup使用
- 使用Cache时的一个小错误
- 关于Recyclerview使用时的一个错误
- GO中的sync.waitgroup的用法
- libcurl 使用的一个错误
- 使用MySql 的 一个错误
- Go 语言sync中waitgroup使用.小实例
- Django+sqlite使用时出现的一个错误的解决方法
- 使用存储过程时一个错误的解决方法。
- 在使用RowDataBound事件时犯的一个错误!
- 使用存储过程时一个错误的解决方法。
- 使用存储过程时一个错误的解决方法
- 使用bool 类型变量赋值时的一个错误
- 使用mvn -P deps命令时遇到的一个错误
- Android使用Camera时的一个小错误
- 使用Qt create编程时提示的一个链接错误
- 在Ubuntu 12.04中安装和配置vmware tools
- Android 5.0学习之使用Palette
- gdb/vim 基础
- 如何解决Kerberos问题: "Server has invalid Kerberos principal: hdfs/host2@****.COM"
- ubuntu14.04 Markdown编辑器推荐之Remarkable
- 记使用WaitGroup时的一个错误
- Mac Error Create Android Project - “Errors running builder 'Android Resource Manager' on project”
- Manacher算法:求解最长回文字符串,时间复杂度为O(N)
- fragment acitivity onActivityResult不响应汇总
- 【译】Git实用教程
- 4Sum
- 记忆中的Splay
- 微信钱包转账到中国银行不到账怎么办 400-6288-629免费热线电话
- 变量