<p>I've been writing up some small applications and going through the go book at the same time and I've started to look at goroutines. </p>
<p>I'm using <code>sync.WaitGroup</code> to wait for all routines to finish, but this is where it goes "wrong".</p>
<p><a href="https://gist.github.com/anonymous/12e294e7faf2d3a909d7" rel="nofollow">This script</a> gives me an error:</p>
<pre><code>fatal error: all goroutines are asleep - deadlock!
goroutine 1 [semacquire]:
sync.(*WaitGroup).Wait(0x2081a0020)
/usr/local/Cellar/go/1.4.2/libexec/src/sync/waitgroup.go:132 +0x169
main.main()
/Users/gist/go/test.go:18 +0x17b
exit status 2
</code></pre>
<p>Now, to my understanding this means that wg.Done() actually never gets executed, or at least doesn't do anything. (I tried with a regular wg.Done() as well without defer). The Println does get executed though, so the goroutine actually progresses.</p>
<p>Now, I've got it working by moving the wg declaration outside of the main() function, <a href="https://gist.github.com/anonymous/397e39c98ae83cd358ca" rel="nofollow">like this</a></p>
<p>My question now is, why does passing WaitGroup through to the PrinLine function not act as the same as declaring it outside of main?</p>
<hr/>**评论:**<br/><br/>AdmiralCornbread: <pre><p>Pass a reference to the WaitGroup into "printLine" instead of a copy. Right now you're making a copy, and the original is never modified when "wg.Done()" is executed.</p>
<p><a href="http://play.golang.org/p/lz53ZOmhUs" rel="nofollow">See this version of your code</a> with this small modification to the function signature and call.</p></pre>alexwhoizzle: <pre><p>So, in your first example you declare the sync.WaitGroup in main(), but you pass a COPY of the sync.WaitGroup to the printLine() function. Calling wg.Done() in printLine() isn't calling Done() on your original WaitGroup, but instead on a COPY of your WaitGroup. To fix this your printLine() function needs to take a pointer to a sync.WaitGroup and you should pass in &wg to your function. </p>
<p>The reason your second example works is because the sync.WaitGroup is declared at the package level, so it can be called from both main() and your printLine() function without any problems.</p>
<p>Read up on <a href="https://golang.org/doc/faq#pass_by_value" rel="nofollow">https://golang.org/doc/faq#pass_by_value</a> for more info.</p></pre>golanguser: <pre><p>That makes a lot of sense now. Thanks for the link to the pass by value, I missed that!</p></pre>
这是一个分享于 的资源,其中的信息可能已经有所发展或是发生改变。
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传