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

代码是从下面看到
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 %s\n", 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的队列?

参考:
https://my.oschina.net/u/157514/blog/149192

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值