记使用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. charles 抓包工具破解方法

    在线破解地址: https://www.zzzmode.com/mytools/charles/ 之后将下载的jar包替换  charles.app ->右键显示包内容 ->content ...

  2. vue学习:解决Apycharm的 * is only available in ES6(use 'esversion: 6') 问题

    使用pycharm打开main.js,代码前出现黄点,js报错了 把鼠标移至import的波浪线上,出现提示:W119 - ‘import’  is only available in ES6(use ...

  3. 使用router.push()进行页面跳转的问题

    看着官网的文档直接router.push()这样会报错router undefind,需要写成this.$router.push()才可以

  4. bzoj 4034 [HAOI2015]树上操作 入栈出栈序+线段树 / 树剖 维护到根距离和

    题目大意 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...

  5. [转]使用ProxyFactoryBean创建AOP代理

    http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ 7.5. 使用ProxyFactoryBean创建AOP代理 - Spring F ...

  6. 【BZOJ1579】Revamping Trails(分层图,最短路,堆)

    题意:每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= ...

  7. 【BZOJ1018】堵塞的交通traffic(线段树,网格图,连通性)

    题意:一个2行C列的矩形网格图,网格上的每个点代表一个城市,相邻的城市之间有一条道路 一开始每条道路都是堵塞的,堵塞即为不可经过.经过一些操作后,可能某些道路通畅了,也可能某些道路堵塞了 多次询问,询 ...

  8. FNV与FNV-1a Hash算法说明【转】

    转自:http://blog.csdn.net/jiayanhui2877/article/details/12090575 The core of the FNV hash The core of ...

  9. Linux 之 Memcached

    Memcached的安装使用 参考教程:[千峰教育] 环境:CentOS 6.8 一.简介: memcached作为高速运行的分布式缓存服务器,具有以下的特点. · 协议简单 · 基于libevent ...

  10. AC日记——合唱队形 洛谷 P1901

    题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2, ...