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

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

與并發功能不一致的結果?

與并發功能不一致的結果?

Go
茅侃侃 2023-03-29 16:06:41
我正在嘗試同時處理文件中的行,但出于某種原因,我似乎得到了不一致的結果。我的代碼的簡化版本如下:  var wg sync.WaitGroup  semaphore := make(chan struct{}, 2)  lengths:= []int{}  for _, file := range(args[1:]){    // Open the file and start reading it    reader, err := os.Open(file)    if err != nil {      fmt.Println("Problem reading input file:", file)      fmt.Println("Error:", err)      os.Exit(0)    }    scanner := bufio.NewScanner(reader)    // Start streaming lines    for scanner.Scan() {      wg.Add(1)      text := scanner.Text()      semaphore <- struct{}{}      go func(line string) {          length := getInformation(line)          lengths = append(lengths, length)          <-semaphore          wg.Done()      }(text)    }  }  wg.Wait()  sort.Ints(lengths)  fmt.Println("Lengths:", lengths)該getInformation函數只是返回行的長度。然后我把那條線添加到一個數組中。我遇到的問題是,當我對同一個文件多次運行時,我在數組中得到了不同數量的項目。我曾假設,因為我使用的waitGroup是每次都會處理所有行,因此內容lengths是相同的,但事實并非如此。誰能看到我在這里做錯了什么?
查看完整描述

1 回答

?
ITMISS

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

正在lengths = append(lengths, length)同時執行。這是不安全的,會導致切片丟失條目等問題。您可以通過將追加調用包裝在互斥鎖中來解決此問題,或者讓 gorountines 將它們的結果發布到一個通道并有一個地方將它們收集到一個切片中。



查看完整回答
反對 回復 2023-03-29
  • 1 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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