登录
首页 >  Golang >  Go问答

下面这段代码加了锁为什么偶尔还是会报panic?

来源:SegmentFault

时间:2023-02-23 21:01:58 457浏览 收藏

本篇文章给大家分享《下面这段代码加了锁为什么偶尔还是会报panic?》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

下面这段代码加了锁为什么偶尔还是会报:panic: send on.closed channel

package main

import (
    "context"
    "fmt"
    "sync"
)

var lock sync.Mutex

func main() {
    // channel 初始化
    c := make(chan int, 10)
    // 用来 recevivers 同步事件的
    wg := sync.WaitGroup{}
    // 上下文
    ctx, cancel := context.WithCancel(context.TODO())

    // 专门关闭的协程
    wg.Add(1)
    go func() {
        defer wg.Done()
        lock.Lock()

        cancel()
        // ... 某种条件下,关闭 channel
        close(c)
        lock.Unlock()
    }()

    // senders(写端)
    for i := 0; i 

正确答案

https://go.dev/ref/spec#Selec...

If one or more of the communications can proceed, a single one that can proceed is chosen via a uniform pseudo-random selection.

https://go.dev/ref/spec#Send_...

A send on a buffered channel can proceed if there is room in the buffer. A send on a closed channel proceeds by causing a run-time panic.

case  并不能阻止 
case c 的执行。因为即使 
c
被关闭了,他依然 "can proceed" ,于是会在
c 中随机选择一个执行。

本篇关于《下面这段代码加了锁为什么偶尔还是会报panic?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表