我有一个作家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)
}
}