V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hihanley
V2EX  ›  问与答

没睡的 gopher 卷王请进

  •  
  •   hihanley · 2022-04-20 01:21:05 +08:00 · 1428 次点击
    这是一个创建于 935 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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-04-20 02:18:42 +08:00   ❤️ 1
    这段代码如果啥都不改的话,应该是几率性的 1 没退出。
    如果 设置 max procs 为 1 ,百分百 1 没退出
    hihanley
        2
    hihanley  
    OP
       2022-04-20 02:56:19 +08:00
    @pigmen 大佬,要怎么改才能让 2 退出 1 也退出呢
    Trim21
        3
    Trim21  
       2022-04-20 03:11:41 +08:00 via Android   ❤️ 1
    @hihanley wg.Done 加在 1 2 这两个 goroutine 里
    Trim21
        4
    Trim21  
       2022-04-20 03:20:22 +08:00 via Android
    hihanley
        5
    hihanley  
    OP
       2022-04-20 04:19:17 +08:00
    @Trim21 好的,感谢大佬
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2074 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:20 · PVG 08:20 · LAX 16:20 · JFK 19:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.