代码之家  ›  专栏  ›  技术社区  ›  arash kordi

golang仅在writer进行更改时阻止读卡器

  •  3
  • arash kordi  · 技术社区  · 7 年前

    我有一个作者goroutine和多个读者goroutine。我想在writer更改数据时阻止读卡器。

    package main
    
    data []int
    
    func main() {
        m := sync.Mutex{}
    
        for i := 0; i< 10; i++ {
            go func reader() {
                for {
                    m.Lock()
                    myData := data
                    m.Unlock()
                    read_from_data(myData)
                }
            }()
        }
    
        go func writer() {
            for {
                newData := new_data()
                m.Lock()
                data = newData
                m.Unlock()
                time.Sleep(1 * time.Seconds)
            }
        }
    }
    

    我怎样才能做到这一点,而不让读者互相阻塞?

    1 回复  |  直到 7 年前
        1
  •  7
  •   icza    7 年前

    这是什么 sync.RWMutex 用于。

    它有两种不同的锁定方法: RWMutex.Lock() 对于作者,以及 RWMutex.RLock() 对于读者。(有两种不同的解锁方法,与不同的锁定方法相匹配: RWMutex.Unlock() RWMutex.RUnlock() .)

    RWMutex 允许多个读卡器或一个写入器。如果某个写入程序获得了锁,则在该写入程序解锁之前,不允许读卡器(也不允许其他写入程序)。如果读卡器获得读锁,则允许任何其他读卡器(但不允许写入器,直到所有读卡器解锁)。

    m := sync.RWMutex{}
    
    for i := 0; i < 10; i++ {
        go func() { // reader
            for {
                m.RLock()
                myData := data
                m.RUnlock()
                read_from_data(myData)
            }
        }()
    }
    
    go func() { // writer
        for {
            newData := new_data()
            m.Lock()
            data = newData
            m.Unlock()
            time.Sleep(1 * time.Seconds)
        }
    }