亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

選擇默認通道競爭條件

選擇默認通道競爭條件

Go
蠱毒傳說 2022-01-17 10:51:09
https://play.golang.org/p/FMKxtVlTL5為什么default:select語句中的程序會無限循環?package mainimport (    "fmt"    "strconv"    "time")var quit chan boolvar counter chan intfunc main() {    counter = make(chan int)    quit = make(chan bool)    go func() {        i := 0        for {            i++            select {            case <-quit:                fmt.Println("Bye!")                return            case counter <- i:                fmt.Println("Send! " + strconv.Itoa(i))            default:                fmt.Println("Default! " + strconv.Itoa(i))            }        }    }()    fmt.Println("Receive! " + strconv.Itoa(<-counter))    fmt.Println("Receive! " + strconv.Itoa(<-counter))    fmt.Println("Receive! " + strconv.Itoa(<-counter))    fmt.Println("Receive! " + strconv.Itoa(<-counter))    fmt.Println("Receive! " + strconv.Itoa(<-counter))    fmt.Println("Receive! " + strconv.Itoa(<-counter))    quit <- true    time.Sleep(1 * time.Second)}
查看完整描述

1 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

當 aselect有 adefault時,它變成非阻塞的。引用規范:

如果一個或多個通信可以進行,則通過統一的偽隨機選擇選擇一個可以進行的通信。否則,如果存在默認情況,則選擇該情況。如果沒有默認情況,“select”語句會阻塞,直到至少有一個通信可以繼續。

如果沒有default, theselect將等到它可以從 接收quit或發送counter,然后執行此操作,然后繼續(再次通過for循環,除非它運行該return)。默認情況下,從不等待任何事情,并且每次可以運行時都會簡單地運行,除非其他操作之一通過。selectdefault

理論上程序還是一樣的,在第六次打印“Send!”后退出。和“接收!” — 但它可能太忙于打印“默認!” 數十億次才能在合理的時間內到達那里。


查看完整回答
反對 回復 2022-01-17
  • 1 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號