我一直在用goroutines做一些測試,我注意到一個奇怪的行為(對我來說)使用這個代碼:游樂場: https://play.golang.org/p/Py4oqGqkYKmpackage mainimport ( "fmt" "sync")var ( mu sync.Mutex wg sync.WaitGroup)func main() { var x int for i := 0; i < 10; i++ { wg.Add(2) go func() { mu.Lock() x = i mu.Unlock() wg.Done() }() go func() { mu.Lock() fmt.Print("x: ", x, " \n") mu.Unlock() wg.Done() }() wg.Wait() }}我期望輸出如下:x: 0 x: 1 x: 2 x: 3 x: 4 x: 5 x: 6 x: 7 x: 8 x: 9 但我收到了:x: 0 x: 0 x: 1 x: 2 x: 3 x: 4 x: 5 x: 6 x: 7 x: 8 看起來第二個戈魯廷被稱為第一個(如后進先出)。想到這一點,我試圖反轉(zhuǎn)戈魯廷,我得到了我所期望的答案:游樂場: https://play.golang.org/p/BC1r3NK6RBmpackage mainimport ( "fmt" "sync")var ( mu sync.Mutex wg sync.WaitGroup)func main() { var x int for i := 0; i < 10; i++ { wg.Add(2) go func() { mu.Lock() fmt.Print("x: ", x, " \n") mu.Unlock() wg.Done() }() go func() { mu.Lock() x = i mu.Unlock() wg.Done() }() wg.Wait() }}輸出:x: 0 x: 1 x: 2 x: 3 x: 4 x: 5 x: 6 x: 7 x: 8 x: 9 任何人都可以幫助我理解這種行為嗎?轉(zhuǎn)到版本:go version go1.16.2 linux/amd64
2 回答

SMILET
TA貢獻1796條經(jīng)驗 獲得超4個贊
Go 語言不指定 goroutine 在顯式同步之外使用通道、互斥鎖、等待組等執(zhí)行的順序。該規(guī)范允許兩個程序的兩個輸出。
您正在觀察互斥體的獲取順序,而不是戈魯丁開始的順序??赡苁谴竽c按預期的順序開始,但意外的大腸首先調(diào)用 Lock()。
該程序確保的唯一排序是通過等待組:每對戈魯丁將在下一對開始之前完成。

一只名叫tom的貓
TA貢獻1906條經(jīng)驗 獲得超3個贊
Go 例程提供并發(fā)性,并在具有獨立堆棧內(nèi)存的共享堆分配之上工作。它們的目的是在多核系統(tǒng)之上提供并發(fā)執(zhí)行。它們?nèi)绾尾⑿袌?zhí)行沒有任何支配因素。這由實際的處理器決定。我們只通過抽象層使用處理器。
實際上,沒有并發(fā)系統(tǒng)可以管理/預測結(jié)果。
- 2 回答
- 0 關(guān)注
- 95 瀏覽
添加回答
舉報
0/150
提交
取消