登录
首页 >  Golang >  Go问答

是否关闭通道阻塞直到接收者读取它

来源:stackoverflow

时间:2024-04-13 18:36:20 459浏览 收藏

从现在开始,努力学习吧!本文《是否关闭通道阻塞直到接收者读取它》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

我实现了一种通过关闭通道来关闭服务器的方法,以便其他 goroutine 读取关闭的通道然后退出。关闭后,我需要对服务器数据进行一些清理,如果 close() 阻塞直到所有其他 goroutine 读取关闭的通道,我可以无锁地访问数据。所以问题是:关闭通道是否会阻塞直到接收者从中读取数据?下面是示例代码:

package main

type server struct {
    chStop chan struct{}
    data map[int]interface{}
}

func newServer() *server {
    return &server {
        chStop: make(chan struct{})
    }
}

func (s *server) stop() {
    close(s.chStop)
    // do something with s.data
    ...
    // if other goroutines already read closed s.chStop and exited,
    // we can access s.data without lock
}

func (s *server) run2() {
    ...
    for {
        select{
        case <-s.chStop:
            return
        case <- other channel:
        // access s.data with lock
        }
    }
}

func (s *server) run() {
    ch := make(chan struct{})
    ...
    for {
        select{
        case <-s.chStop:
            return
        case <- ch:
            // access s.data with lock
        }
    }
}

func main() {
    s := newServer()
    go s.run()
    go s.run2()
    s.stop()
}

解决方案


没有。请改用 sync.WaitGroup

本篇关于《是否关闭通道阻塞直到接收者读取它》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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