关于使用sync.WaitGroup进行同步的问题

hacker_cgh · · 852 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

***源代码如下*** ``` /* 1.学习goroutin 间的chan数据传输(进程间通讯可使用分布式系统的方式解决,比如使用socket、http通讯协议) 2.学习select使用 */ package main import ( "lib/publib/github.com/wonderivan/logger" "runtime" "sync" "time" ) func main() { logger.Warn("***************************************************************************************************") logger.Warn("1.学习goroutin 间的chan数据传输(进程间通讯可使用分布式系统的方式解决,比如使用socket、http通讯协议)") logger.Warn("2.学习select使用") logger.Warn("***************************************************************************************************") runtime.GOMAXPROCS(runtime.NumCPU()) wg := sync.WaitGroup{} iChan := make(chan int, 1) sChan := make(chan rune, 1) go sendIchan(&wg,iChan) go sendSchan(&wg,sChan) go mainComm(&wg,iChan, sChan, 2) /*这里不能再用gorutin,必须要阻塞主函数,否则主routin先退出不会有任何输出*/ time.Sleep(2*time.Second) wg.Wait() } func sendIchan(wg *sync.WaitGroup,iChan chan int) { wg.Add(1) for i := 0; i < 10; i++ { iChan <- i //time.Sleep(1*time.Second) logger.Debug("add %v to iChan",i) } return } func sendSchan(wg *sync.WaitGroup,sChan chan rune) { wg.Add(1) for c := 'A'; c <= 'Z'; c++ { sChan <- c //time.Sleep(1*time.Second) logger.Debug("add %c to sChan",c) } return } func mainComm(wg *sync.WaitGroup,iChan chan int, sChan chan rune, iTimeOut time.Duration) { for { select { case v, ok := <-iChan: if !ok { logger.Error("iChan Read Error") break } logger.Debug("read %v From iChan", v) wg.Done() case v, ok := <-sChan: if !ok { logger.Error("sChan Read Error") break } logger.Debug("read %c From sChan", v) wg.Done() case <-time.After(iTimeOut * time.Second): logger.Error("%ds 超时未收到数据", iTimeOut) break } } }``` 运行结果如下: ![无标题.png](https://static.studygolang.com/190430/dff552df3c9e564d96f5a1369b43d8fa.png) ***求教各路大神,为什么WaitGroup counter会变成负数?***

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

852 次点击  
加入收藏 微博
1 回复  |  直到 2019-05-01 19:03:07
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传