Golang 如何並發共享變數
這次討論的重點是理解 Go 中多個 goroutine 之間如何共享變數。考慮以下程式碼:
<code class="go">package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) x := i go func() { defer wg.Done() fmt.Println(x) }() } wg.Wait() fmt.Println("Done") }</code>
執行後,得到預期輸出:
4 0 1 3 2
但是當程式碼進行細微修改時:
<code class="go">package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println(i) }() } wg.Wait() fmt.Println("Done") }</code>
結果輸出出乎意料一致:
5 5 5 5 5
解釋
關鍵差異在於Goroutine 中變數的作用域。
In在第一個程式碼片段中,循環的每次迭代都會建立一個新變數 x 並將其值傳遞給 goroutine。當 goroutine 執行時,它有 x 的本機副本並列印其初始值。這樣就得到了預期的輸出。
但是,在第二個程式碼片段中,所有 goroutine 共用一個變數 i。當 goroutine 執行時,它會在循環完成後檢索 i 的最終值。因此,所有 goroutine 都輸出相同的值,5。
影響和最佳實踐
這種行為凸顯了使用 goroutine 時變數範圍的至關重要性。為了確保執行緒安全執行,必須考慮變數的範圍並在必要時利用等待群組等同步原語(如兩個程式碼片段所示)。
以上是為什麼 Golang Goroutines 在共享變數時輸出相同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!