杰克工作室 发表于 2023-3-1 11:04

以下为chan和waitgroup混合使用,能正常运行吗

请看以下代码:
<pre>
package&nbsp;main
&nbsp;
import&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&quot;fmt&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&quot;sync&quot;
)
&nbsp;
func&nbsp;main()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;wg&nbsp;sync.WaitGroup
&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;:=&nbsp;make(chan&nbsp;struct{})
&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;:=&nbsp;make(chan&nbsp;struct{})
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;token&nbsp;struct{}
&nbsp;&nbsp;&nbsp;&nbsp;sender&nbsp;:=&nbsp;func()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defer&nbsp;wg.Done()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;-begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;2;&nbsp;i&nbsp;++&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;sender---&quot;,&nbsp;i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&lt;-&nbsp;token
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;receiver&nbsp;:=&nbsp;func()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defer&nbsp;wg.Done()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;-begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;2;&nbsp;i++&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;receiver---&quot;,&nbsp;i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;-c
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;wg.Add(2)
&nbsp;&nbsp;&nbsp;&nbsp;go&nbsp;sender()
&nbsp;&nbsp;&nbsp;&nbsp;go&nbsp;receiver()
&nbsp;&nbsp;&nbsp;&nbsp;close(begin)
&nbsp;&nbsp;&nbsp;&nbsp;wg.Wait()
}
</pre>

<p>问题:</p>

<p>1、begin这里已经阻塞了吗?可以正常运行吗?为什么?</p>

<p>2、如果能运行,请写出可能的运行结果?</p>

杰克工作室 发表于 2023-7-26 16:38

答:
1、begin已经阻塞了。可以正常运行。虽然前面begin阻塞了,但后面close(begin),已经不阻塞了。
2、由于是goroutine运行,随机调度,运行结果不唯一。大致如下:

receiver--- 0
sender--- 0
sender--- 1
receiver--- 1
页: [1]
查看完整版本: 以下为chan和waitgroup混合使用,能正常运行吗