代码之家  ›  专栏  ›  技术社区  ›  Hoffmann

go atomic/thread save中的append()是否保存?

  •  -3
  • Hoffmann  · 技术社区  · 7 年前

    通过阅读几个列表,我想将每个列表中的所有行添加到一个大数组中。我在自己的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 回复  |  直到 7 年前
        1
  •  0
  •   Vorsprung    7 年前

    这样就可以了。或者您可能需要考虑一种不同的体系结构,例如使用通道将更新提供给单个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()
      }
    }