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>
- 1 回答
- 0 關(guān)注
- 121 瀏覽
添加回答
舉報(bào)