V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
hihanley
V2EX  ›  问与答

没睡的 gopher 卷王请进

  •  
  •   hihanley · Apr 20, 2022 · 1853 views
    This topic created in 1479 days ago, the information mentioned may be changed or developed.
    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 replies    2022-04-20 04:19:17 +08:00
    pigmen
        1
    pigmen  
       Apr 20, 2022   ❤️ 1
    这段代码如果啥都不改的话,应该是几率性的 1 没退出。
    如果 设置 max procs 为 1 ,百分百 1 没退出
    hihanley
        2
    hihanley  
    OP
       Apr 20, 2022
    @pigmen 大佬,要怎么改才能让 2 退出 1 也退出呢
    Trim21
        3
    Trim21  
       Apr 20, 2022 via Android   ❤️ 1
    @hihanley wg.Done 加在 1 2 这两个 goroutine 里
    Trim21
        4
    Trim21  
       Apr 20, 2022 via Android
    hihanley
        5
    hihanley  
    OP
       Apr 20, 2022
    @Trim21 好的,感谢大佬
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5732 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 07:43 · PVG 15:43 · LAX 00:43 · JFK 03:43
    ♥ Do have faith in what you're doing.