记使用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. C 语言 文件读写

    在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之.一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:type ...

  2. ajax 分页(jquery分页插件pagination) 小例2

    封装成:myPagination.js// ajax分页 function sendAjax(flag, dataParam, url, callback) {//封装的ajax: var shus ...

  3. 阿里云oss教程

    OSS是提供非结构化数据存取的服务.对于刚开始使用OSS的用户,非结构数据可以理解为word文档.PDF.PPT.EXCEL表格.MP3.MKV.RMVB.HTML等各种类型文件.OSS提供API去进 ...

  4. 洛谷——P1220 关路灯

    P1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉 ...

  5. k8s之存储卷及pvc

    1.存储卷概述 因为pod是有生命周期的,pod一重启,里面的数据就没了,所以我们需要数据持久化存储,在k8s中,存储卷不属于容器,而是属于pod,也就是说同一个pod中的容器可以共享一个存储卷,存储 ...

  6. 从源码解析 Spring JDBC 异常抽象

    初入学习 JDBC 操作数据库,想必大家都写过下面的代码: 数据库为:H2 如果需要处理特定 SQL 异常,比如 SQL 语句错误,这个时候我们应该怎么办? 查看 SQLException 源码,我们 ...

  7. DELPHI 10.2(TOKYO) FOR LINUX的兼容性说明

    DELPHI 10.2(TOKYO) FOR LINUX的兼容性说明 自DELPHI 10.2(TOKYO) 始开始支持Linux . Delphi Linux 编译器 64 位 Linux 平台支持 ...

  8. Mac环境下安装运行splash

    http://blog.csdn.net/chenhy8208/article/details/69391097 最近需要使用scrapy爬虫做一些开发,用到了splash.我本机是mac环境,跳着看 ...

  9. Python下opencv使用笔记(七)(图像梯度与边缘检測)

    梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(无论是横向的.纵向的.斜方向的等等),所须要的无非也是一个核模板.模板的不同结果也不同.所以能够看到,全部的这些个算子函数,归结究竟都能够用 ...

  10. require.js使用

    无可奈何,二开项目用了require.js! 一道槛是挨不过去了 require官网: http://requirejs.org/ require.js cdn: <script src=&qu ...