Это то, для чего 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)
}
}