记使用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时的一个错误的更多相关文章

  1. 路由器安装ubuntu-16.04.1-server-amd64出现“无法安装busybox-initramfs”错误。向目标系统中安装busybox-initramfs软件包时出现一个错误。请检查/var/log/syslog或查看第四虚拟控制台以获得详细

    公司的路由器要ubuntu服务器进行路由网络功能的管理,在安装的时候出现下面的错误提示: 安装ubuntu-16.04.1-server-amd64出现“无法安装busybox-initramfs”错 ...

  2. windows Server 2012/2016 路由和远程访问,PPPOE,ADSL,连接接口时出现一个错误,连接被远程计算机终止

    经过查询资料,是由mprddm.dll的bug引起的. 修改位置: 将je修改为jmp. 查找修改位置,可参考 前面的RasGetPortUserData的调用,或者 后面的 字符串 64位dll可使 ...

  3. windows网卡共享网络时,报Internet连接共享访问被启用时,出现了一个错误。(null)

    今天笔者在自己电脑上作试验时,准备将无线网络连接共享给VMnet1时报Internet连接共享访问被启用时,出现了一个错误.(null)错误: 经上网查询到问题原因:没有启用 Windows Fire ...

  4. python运行selenium时出现的一个错误总结

    1.SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 场景:运用pan ...

  5. 【SD系列】SAP 查看销售订单时,报了一个错误消息,“项目不符合计划行(程序错误)”

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP 查看销售订单时,报了一个错误 ...

  6. 配置Java环境变量时的一个常见错误

    我们在把JDK路径配置为环境变量时,有一个常用的配置方法,就是把JDK根路径配置为"JAVA_HOME"值,然后在Path中添加一条"%JAVA_HOME%\bin&qu ...

  7. C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”

    Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...

  8. [转]在 .NET 中远程请求 https 内容时,发生错误:根据验证过程,远程证书无效

    该文原网址:http://www.cnblogs.com/xwgli/p/5487930.html 在 .NET 中远程请求 https 内容时,发生错误:根据验证过程,远程证书无效.   当访问 h ...

  9. 编译php时出现xsl错误的解决方法

    是因为系统没安装一个叫 libxslt-devel 的包, 安装上就好了. 附编译php时的常见错误: http://www.myhack58.com/Article/sort099/sort0102 ...

随机推荐

  1. 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)

    题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...

  2. 随机生成指定长度字符字符串(C语言实现)

    相关函数 srand(), rand()头文件#include<stdlib.h> 定义函数 int rand(void) 函数说明 rand()会返回一随机数值,范围在0至RAND_MA ...

  3. Linux命令文件查看过滤

    Linux命令篇 1.查看一个文件的后100行的命令: tail -n 100 Linux下查看文件前几行一般用head -n xx,查看后面几行用tail -n xx.除此之外,还有: tail - ...

  4. hdu 1242(搜索)

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. C#知识点总结:Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  6. AC日记——网络最大流 洛谷 P3376

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  7. jquery 分页功能

    <div class="wrapper"> <div class="row"> <div class="col-sm-1 ...

  8. Java 网络通信【01】TCP

    不积跬步,无以至千里:不积小流,无以成江海.——<荀子劝学> JAVA中设计网络编程模式的主要有TCP和UDP两种. TCP是属于即时通信,点对点连接进行通信. UDP是通过数据包来进行通 ...

  9. Network | parity bit

    奇偶校验位是一个表示给定位数的二进制数中1的个数是奇数还是偶数的二进制数.奇偶校验位是最简单的错误检测码. A parity bit, or check bit is a bit added to t ...

  10. Codeforces Gym 100203H Highways 最小生成树

    原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 给你平面上若干点,生成一颗完全图,让 ...