没睡的 gopher 卷王请进

2022-04-20 01:21:05 +08:00
 hihanley
func TestClose(t *testing.T) {
	rand.Seed(time.Now().UnixNano())
	wg := sync.WaitGroup{}
	wg.Add(1)
	go func() {
		defer wg.Done()
		stop := make(chan struct{})
		// goroutine 1
		go func() {
			for range stop {
				return
			}
		}()
		// goroutine 2
		go func() {
			defer close(stop)
			for {
				if rand.Intn(10) < 3 {
					return
				}
			}
		}()
		<-stop
	}()
	wg.Wait()
}

什么情况下 goroutine2 退出了但是 1 没退出

1365 次点击
所在节点    问与答
5 条回复
pigmen
2022-04-20 02:18:42 +08:00
这段代码如果啥都不改的话,应该是几率性的 1 没退出。
如果 设置 max procs 为 1 ,百分百 1 没退出
hihanley
2022-04-20 02:56:19 +08:00
@pigmen 大佬,要怎么改才能让 2 退出 1 也退出呢
Trim21
2022-04-20 03:11:41 +08:00
@hihanley wg.Done 加在 1 2 这两个 goroutine 里
Trim21
2022-04-20 03:20:22 +08:00
hihanley
2022-04-20 04:19:17 +08:00
@Trim21 好的,感谢大佬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/848024

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX