我寫了一個(gè)退出和同步隊(duì)列通道預(yù)期打印如下,但沒(méi)有發(fā)生,將g1或g2打印值連續(xù)按兩個(gè)我知道無(wú)緩沖通道同步規(guī)則,但似乎我誤解了它g1 0 g2 1 g1 1g2 1g1 2g2 2package mainimport ( "fmt")func main() { exit := make(chan struct{}) transfer := make(chan int) go func() { defer func() { close(exit) }() for i := 0; i < 20; i++ { transfer <- i fmt.Println("g1\t", i) // 1 } }() go func() { for i := 0; i < 20; i++ { <-transfer fmt.Println("g2\t", i) // 3 4 } }() <-exit}
2 回答

胡說(shuō)叔叔
TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
因此,當(dāng)您使用無(wú)緩沖通道時(shí),它是阻塞交易;發(fā)生的事情是go例程在某個(gè)點(diǎn)停止并且需要執(zhí)行事務(wù);一旦交易發(fā)生;兩個(gè) go 例程現(xiàn)在都可以向前移動(dòng),調(diào)度程序需要決定哪個(gè) go 例程將首先運(yùn)行 g1 和 g2 以相同的順序打印不是 100%的可能性。

元芳怎么了
TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
那是因?yàn)檫@里有數(shù)據(jù)。
你不能確定在之后和之前不應(yīng)該有上下文切換到另一個(gè)例程。transfer <- i
fmt.Println("g1\t", i) // 1
因此,如果您希望這是原子的,則應(yīng)在此處添加另一種同步機(jī)制
- 2 回答
- 0 關(guān)注
- 106 瀏覽
添加回答
舉報(bào)
0/150
提交
取消