hihanley
V2EX  ›  问与答

没睡的 gopher 卷王请进

By hihanley at 2022 年 4 月 20 日 · 2173 次点击
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 没退出

5 条回复  •  2022-04-20 04:19:17 +08:00
pigmen
   1
pigmen  
   2022 年 4 月 20 日   ❤️ 1
这段代码如果啥都不改的话,应该是几率性的 1 没退出。
如果 设置 max procs 为 1 ,百分百 1 没退出
hihanley
   2
hihanley  
OP
   2022 年 4 月 20 日
@pigmen 大佬,要怎么改才能让 2 退出 1 也退出呢
Trim21
   3
Trim21  
   2022 年 4 月 20 日 via Android   ❤️ 1
@hihanley wg.Done 加在 1 2 这两个 goroutine 里
Trim21
   4
Trim21  
   2022 年 4 月 20 日 via Android
hihanley
   5
hihanley  
OP
   2022 年 4 月 20 日
@Trim21 好的,感谢大佬
© 2026 V2EX · 26ms · 3.9.8.5