找回密码
 立即注册
搜索
查看: 543|回复: 1

[go基础] 以下为chan和waitgroup混合使用,能正常运行吗

  [复制链接]
发表于 2023-3-1 11:04 | 显示全部楼层 |阅读模式
请看以下代码:
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()
}

问题:

1、begin这里已经阻塞了吗?可以正常运行吗?为什么?

2、如果能运行,请写出可能的运行结果?

 楼主| 发表于 2023-7-26 16:38 | 显示全部楼层
答:
1、begin已经阻塞了。可以正常运行。虽然前面begin阻塞了,但后面close(begin),已经不阻塞了。
2、由于是goroutine运行,随机调度,运行结果不唯一。大致如下:

receiver--- 0
sender--- 0
sender--- 1
receiver--- 1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|学习笔记

GMT+8, 2024-12-21 20:23 , Processed in 0.025320 second(s), 13 queries , APCu On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表