求解在学习go语言中遇到关于**mutex**的一个问题

wenaiys · 2023-03-26 13:07:05 · 1502 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-03-26 13:07:05 的主题,其中的信息可能已经有所发展或是发生改变。

在一个协程中使用Mutex时,同时往无缓存的channel中写入数据,为什么没有出现死锁?(尽管在主协程中有读操作) 代码如下:

func main() {
    ch1 := make(chan int)
    mutx := sync.RWMutex{}
    go func() {
        mutx.Lock()
        for i := 0; i < 10; i++ {
            ch1 <- i
        }
        defer close(ch1)
        mutx.Unlock()
    }()
    for {
        r := <-ch1
        fmt.Println(r)
        time.Sleep(time.Second)
    }

}

具体问题: 使用互斥锁之后,应该是先执行完该协程的代码才会继续执行其它代码吧?那往该协程中往无缓存channel中写入数据,应该出现死锁才对吧?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1502 次点击  ∙  1 赞  
加入收藏 微博
1 回复  |  直到 2023-03-26 16:31:15
chengxuge
chengxuge · #1 · 2年之前

无缓存的chan,读写都是同步的,这段代码里mutex是可以删掉的,所以不会出现死锁

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传