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

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

WaitGroup 不受雙重尊重

WaitGroup 不受雙重尊重

Go
米脂 2022-06-01 16:44:27
我正在關注不同的示例教程,我在嵌套兩個循環時遇到問題。我想要的是sum變量必須給出 2500結果總和 = 2298、2266、2254就像循環沒有給你時間結束package mainimport (    "fmt"    "sync"    "time")var iterate = 50var sum = 0func main() {    timeStart := time.Now()    var wg sync.WaitGroup    for i := 0; i < iterate; i++ {        for i2 := 0; i2 < iterate; i2++ {            wg.Add(1)            go func() {                defer wg.Done()                sum++                time.Sleep(5 * time.Millisecond)            }()        }    }    wg.Wait()    timeEnd := time.Now().Sub(timeStart)    fmt.Println(timeEnd, sum)}
查看完整描述

2 回答

?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

正如評論中指出的那樣。sum應使用sync.Mutex, 更改前鎖定sum和解鎖后進行保護。如下所示修改后的代碼將打印出 2500。


package main


import (

    "fmt"

    "sync"

    "time"

)


var iterate = 50

var sum = 0


func main() {



    m := sync.Mutex{}


    timeStart := time.Now()


    var wg sync.WaitGroup


    for i := 0; i < iterate; i++ {


        for i2 := 0; i2 < iterate; i2++ {


            wg.Add(1)


            go func() {


                defer wg.Done()


                m.Lock()

                sum++

                m.Unlock()


                time.Sleep(5 * time.Millisecond)


            }()


        }


    }


    wg.Wait()


    timeEnd := time.Now().Sub(timeStart)


    fmt.Println(timeEnd, sum)


}


查看完整回答
反對 回復 2022-06-01
?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

顯然問題是同時從不同的地方寫入一個變量。

查看錯誤輸出

go run -race app.go


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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