1 回答

TA貢獻1827條經驗 獲得超8個贊
matched = append(matched, w)
是一個不同步的關鍵部分,導致競爭條件。這不是原子操作。goroutine 有許多不同的交錯,會導致不同的輸出,并且是完全不可預測的,可能會丟失數據。
使這個線程安全(并發執行安全)的最簡單方法是matched使用mutex同步訪問:
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)
}
互斥鎖確保在任何給定時間只有一個 go 例程能夠執行append,matched因此您永遠不會覆蓋附加。
我認為你可能仍然有不同的數組結果,具體取決于 goroutines 的執行順序,但你不會丟失數據,因為它是同步的。
- 1 回答
- 0 關注
- 122 瀏覽
添加回答
舉報