Go 武林外傳 - 霸王餐 (上)

taadis發表於2020-03-19

幾日的奔波, 小白來到了一個新的小鎮, 街上人來人往, 車水馬龍, 一切顯的繁華而又有序.

啃了幾天乾糧嘴裡都快淡出個鳥來了, 找家客棧歇下腳, 順便找點好吃的 —— 小白心想.

打聽了下, 鎮上有家 “雙珠砂鍋” 味道不錯, 就這家了.

吃完準備結賬時, 小白看到店裡有個 “答題免單” 的活動, 題目如下:

// main.go
package main

import (
    "fmt"
    "sync"
)

func main()  {
    counter := 0
    wg := sync.WaitGroup{}
    for i := 0; i < 10000; i++{
        wg.Add(1)
        go func() {
            counter++
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println(counter)
}

看起來很簡單, 不就是讓一萬個協程累加計數器嘛, 結果應該是 10000 才對.

可麻溜的執行後輸出如下:

go run main.go
9471

咦, 小白楞了一下, 不信邪的又執行了一遍:

go run main.go
9456

啊呀我去, 見鬼了, 小白賭氣的又執行了 N 多次, 結果沒有一個輸出是等於 10000 的, 基本都小於 10000.

許久, 小白敗下陣來, 不得不承認是自己沒看懂這道題.

只好乖乖的付賬走人.

“我一定要吃上一頓霸王餐” —— 不服輸的小白惡狠狠地說到.

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章