第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

for 循環(huán)中的 Goroutines 返回不同的值

for 循環(huán)中的 Goroutines 返回不同的值

Go
桃花長(zhǎng)相依 2022-05-23 16:39:10
我正在嘗試練習(xí)圍棋套路。我在這里想念什么?這段代碼給我返回了一個(gè)不同的數(shù)組結(jié)果。func goRoutinesSearch(body string, keywords []string) {     lowerBody := strings.ToLower(body)     var matched []string     var wg sync.WaitGroup     wg.Add(len(keywords))     for _, word := range keywords {         go func(w string) {             defer wg.Done()             if strings.Contains(lowerBody, w) {                 matched = append(matched, w)             }         }(word)     }     wg.Wait()     fmt.Print(matched)}
查看完整描述

1 回答

?
慕仙森

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊

matched = append(matched, w)

是一個(gè)不同步的關(guān)鍵部分,導(dǎo)致競(jìng)爭(zhēng)條件。這不是原子操作。goroutine 有許多不同的交錯(cuò),會(huì)導(dǎo)致不同的輸出,并且是完全不可預(yù)測(cè)的,可能會(huì)丟失數(shù)據(jù)。


使這個(gè)線程安全(并發(fā)執(zhí)行安全)的最簡(jiǎn)單方法是matched使用mutex同步訪問(wèn):


func goRoutinesSearch(body string, keywords []string) {

     lowerBody := strings.ToLower(body)

     var mutex = &sync.Mutex{}

     var matched []string

     var wg sync.WaitGroup

     wg.Add(len(keywords))

     for _, word := range keywords {

         go func(w string) {

             defer wg.Done()

             if strings.Contains(lowerBody, w) {

                 mutex.Lock()

                 matched = append(matched, w)

                 mutex.Unlock()

             }

         }(word)

     }

     wg.Wait()

     fmt.Print(matched)

}

互斥鎖確保在任何給定時(shí)間只有一個(gè) go 例程能夠執(zhí)行append,matched因此您永遠(yuǎn)不會(huì)覆蓋附加。


我認(rèn)為你可能仍然有不同的數(shù)組結(jié)果,具體取決于 goroutines 的執(zhí)行順序,但你不會(huì)丟失數(shù)據(jù),因?yàn)樗峭降摹?/p>


查看完整回答
反對(duì) 回復(fù) 2022-05-23
  • 1 回答
  • 0 關(guān)注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)