博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记使用WaitGroup时的一个错误
阅读量:5279 次
发布时间:2019-06-14

本文共 2120 字,大约阅读时间需要 7 分钟。

记使用WaitGroup时的一个错误

近期重构我之前写的server代码时,不当使用了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。

以后实际处理中要注意下。尽量降低中间处理。把这样的需相应的简洁化处理.

只是近期重构server蛮爽的。经过大遍大遍的清理代码,梳理流程后。

代码看着顺眼了非常多。

只是还是任重而道远。

BLOG: blog.csdn.net/xcl168

转载于:https://www.cnblogs.com/wzzkaifa/p/7199952.html

你可能感兴趣的文章
java中的占位符\t\n\r\f
查看>>
7.14
查看>>
SDN2017 第一次作业
查看>>
MySQL通过frm 和 ibd 恢复数据过程
查看>>
AngularJs 学习笔记(2)
查看>>
关于元素优先级
查看>>
oo第一单元作业总结
查看>>
SRS源码——Listener
查看>>
web.xml 4.0 头
查看>>
Java面向对象抽象类案例分析
查看>>
100.Same Tree
查看>>
JAVA 根据经纬度算出附近的正方形的四个角的经纬度
查看>>
Linux系统配置matlab2009b
查看>>
ZH奶酪:基于ionic.io平台的ionic消息推送功能实现
查看>>
对SPI、IIC、IIS、UART、CAN、SDIO、GPIO的解释
查看>>
Thymeleaf模板格式化LocalDatetime时间格式
查看>>
庖丁解“学生信息管理系统”
查看>>
Pyltp使用
查看>>
Java8函数之旅 (七) - 函数式备忘录模式优化递归
查看>>
移植LWIP(ENC28J60)
查看>>