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

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)
        }
    }
}

在没有读者互相阻碍的情况下,我该怎么做?

最佳答案

这就是 sync.RWMutex 的用途。

它有2种不同的锁定方法:作家的 RWMutex.Lock() 和读者的 RWMutex.RLock() 。 (并且有2种不同的解锁方法,与不同的锁定方法匹配: RWMutex.Unlock() RWMutex.RUnlock() 。)
RWMutex允许多个读取器或1个写入器。如果某个写程序获得了锁,则在该写程序解锁之前,不允许任何读程序(同样,不允许其他写程序)。如果某个读取器获得了读取锁,则将允许任何其他读取器(但不允许写入器,除非所有读取器都解锁)。

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)
    }
}

10-07 23:12