小编Tom*_*mos的帖子

使用 go 通道使结构线程安全

假设我有以下结构:

package manager

type Manager struct {
    strings []string
}

func (m *Manager) AddString(s string) {
    m.strings = append(m.strings, s)
}

func (m *Manager) RemoveString(s string) {
    for i, str := range m.strings {
        if str == s {
            m.strings = append(m.strings[:i], m.strings[i+1:]...)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此模式不是线程安全的,因此以下测试由于某些竞争条件(数组索引超出范围)而失败:

func TestManagerConcurrently(t *testing.T) {
    m := &manager.Manager{}
    wg := sync.WaitGroup{}
    for i:=0; i<100; i++ {
        wg.Add(1)
        go func () {
            m.AddString("a")
            m.AddString("b")
            m.AddString("c")
            m.RemoveString("b")
            wg.Done()
        } ()
    }
    wg.Wait()

    fmt.Println(m)
}
Run Code Online (Sandbox Code Playgroud)

我是 Go …

go channels

3
推荐指数
2
解决办法
338
查看次数

标签 统计

channels ×1

go ×1