以下为chan和waitgroup混合使用,能正常运行吗
请看以下代码:<pre>
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
begin := make(chan struct{})
c := make(chan struct{})
var token struct{}
sender := func() {
defer wg.Done()
<-begin
for i := 0; i < 2; i ++ {
fmt.Println("sender---", i)
c <- token
}
}
receiver := func() {
defer wg.Done()
<-begin
for i := 0; i < 2; i++ {
fmt.Println("receiver---", i)
<-c
}
}
wg.Add(2)
go sender()
go receiver()
close(begin)
wg.Wait()
}
</pre>
<p>问题:</p>
<p>1、begin这里已经阻塞了吗?可以正常运行吗?为什么?</p>
<p>2、如果能运行,请写出可能的运行结果?</p>
答:
1、begin已经阻塞了。可以正常运行。虽然前面begin阻塞了,但后面close(begin),已经不阻塞了。
2、由于是goroutine运行,随机调度,运行结果不唯一。大致如下:
receiver--- 0
sender--- 0
sender--- 1
receiver--- 1
页:
[1]