我有一个 writer goroutine 和多个 reader 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
是为了。
它有两种不同的锁定方式: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)
}
}
关于golang 仅在作者进行更改时才阻止读者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50372151/