加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang日記 - channel同步(代码段)

发布时间:2020-12-16 18:13:33 所属栏目:大数据 来源:网络整理
导读:代码是从下面看到 https://stackoverflow.com/questions/20793568/golang-anonymous-struct-and-empty-struct package main import "fmt" var battle = make ( chan string ) func warrior(name string ,done chan struct {}) { select { case opponent := -

代码是从下面看到
https://stackoverflow.com/questions/20793568/golang-anonymous-struct-and-empty-struct

package main

import "fmt"

var battle = make(chan string)

func warrior(name string,done chan struct{}) {
    select {
    case opponent := <-battle:
        fmt.Printf("%s beat %sn",name,opponent)
    case battle <- name:
        // I lost :-(
    }
    done <- struct{}{}
}

func main() {
    done := make(chan struct{})
    langs := []string{"Go","C","C++","Java","Perl","Python"}
    for _,l := range langs { go warrior(l,done) }
    for _ = range langs { <-done }
}

这段代码主要解决的问题是 : 主函数(main)与子协程的同步问题. 即 main要同步它们,不提前做其他事情.

接下来分析一下代码

初始化

done := make(chan struct{})

导入同步标志

done <- struct{}{}

导出同步标志

for _ = range langs { <-done }

这里的做法让人有一种错觉,和queue和stack类似,如果 <-done 这操作没有指示弹出,就会一直处于阻塞状态,直到有指示位置. 但是,这里就有个问题,它有buffer吗? 从代码上看,它是没有的,那么它如何实现这种类似queue和stack的队列?

参考:
http://www.52php.cn/article/p-ppexneqk-bre.html

我的理解是,这里的信号存入和信号取出是即时的,先执行「取|读」,这个行为触发了「存|写」

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读