是go(原子/线程)保存中的append()?

时间:2018-12-13 15:23:53

标签: go append goroutine

通读几个列表,我想将每个列表中的所有行添加到一个大数组中。我在自己的goroutine中运行每个列表阅读器。我可以在读取后立即添加一行吗?

此线程是否保存或可以在我手中爆炸?

type listHolder {
  entries []entry
}

func (h *listHolder) readAllLists(s []list) {
  c := make(chan list)
  var wg sync.WaitGroup

  for _, l := range s {
    wg.Add(1)
    go h.readSomeList(&wg, l)
  }

  c.close()
  wg.Wait()  
}

func (h *listHolder) readSomeList(wg *sync.WaitGroup, l list) {
  defer wg.Done()
  for e := range extractEntry(l) {
    h.entries = append(h.entries, newEntry(e))
  }
}

1 个答案:

答案 0 :(得分:0)

这样的事情就可以了。或者您可能想考虑一个不同的体系结构,例如使用通道将更新提供给一个go例程

type listHolder {
  entries []entry
  m sync.Mutex
}

func (h *listHolder) readAllLists(s []list) {
  c := make(chan list)
  var wg sync.WaitGroup

  for _, l := range s {
    wg.Add(1)
    go h.readSomeList(&wg, l)
  }

  c.close()
  wg.Wait()  
}

func (h *listHolder) readSomeList(wg *sync.WaitGroup, l list) {
  defer wg.Done()

  for e := range extractEntry(l) {
    h.m.Lock()
    h.entries = append(h.entries, newEntry(e))
    h.m.Unlock()
  }
}