第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Go基礎(chǔ)系列:雙層channel用法示例

標(biāo)簽:
Go

以下是一个双层通道的使用示例。注意下面的示例中使用了"信号通道"(Signal channel),但这里的信号通道是多余的,仅仅只是为了介绍。

信号通道不用来传递数据,而是用来传递消息,用来产生可读、可写的事件,以便让select选中某个分支。产生消息事件的方式有多种,比如直接关闭通道、发送false/true布尔值等等

package main import (    "fmt"
    "time")func main() {    // 定义双层通道cc
    cc := make(chan chan int)
    times := 5
    for i := 1; i < times+1; i++ {        // 定义信号通道f
        f := make(chan bool)        // 每次循环都在双层通道cc中生成内层通道c
        // 并通过信号通道f来终止f1()
        go f1(cc, f)        // 从双层通道cc中取出内层通道ch
        // 并向ch通道发送数据
        ch := <-cc
        ch <- i        // 从ch中取出数据
        for sum := range ch {
            fmt.Printf("Sum(%d)=%d\n", i, sum)
        }        // 每个循环睡眠一秒钟
        time.Sleep(time.Second)        // 每次循环都关闭信号通道f
        close(f)
    }
}// 双层通道cc用来生成内层通道c// 并使用信号通道f来终止函数f1()func f1(cc chan chan int, f chan bool) {
    c := make(chan int)
    cc <- c    defer close(c)
    sum := 0
    select {    // 从内层通道中取出数据,计算和,然后发回内层通道
    case x := <-c:        for i := 0; i <= x; i++ {
            sum = sum + i
        }        // goroutine将阻塞在此,直到数据被读走
        c <- sum    // 信号通道f可读时,结束f1()的运行
    // 但因为select没有在for中,该case分支用不上
    case <-f:        return
    }
}

上面的示例中,函数f1()两个参数,一个是双层通道cc,一个是信号通道f。f1()中首先生成了一个通道c,并发送给了双层通道cc,使得main()中可以从cc中取得这个内层通道c,并向其发送数据。

回到f1()中,select最初会被阻塞,因为内层通道c和信号通道f都没有数据可读。由于main()可以取得内层通道c,并向其发送数据,使得f1()中的select第一个case分支被选中,该分支会计算发送的整数之前的总和,并将计算结果重新发送给内层通道c,让main()可以取得这个计算结果。

上面的示例中有几个细节需要注意:

  1. 在f1()中必须关闭内层通道c,因为main()中的range迭代一个未关闭的通道会一直阻塞,而且每次调用f1()都会重新创建c通道。

  2. 上面的信号通道其实没有起到任何作用。

  3. f1()中的select必须不能放进for循环。因为f1()将数据发回c之后,如果在for中,发f()所在的goroutine将阻塞在select上,由于c通道还没有关闭,这会导致main goroutine因range迭代操作而阻塞,也就是说所有goroutine都被阻塞了,出现了死锁。

所以,当在select中有发送操作的时候,很可能会出现死锁现象。这时,要么为select加上default,要么为select加上超时时间,要么select不要放在for循环中

 

转载请注明出处:https://www.cnblogs.com/f-ck-need-u/p/9994496.html


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
JAVA開發(fā)工程師
手記
粉絲
33
獲贊與收藏
208

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消