Я сталкиваюсь с ситуацией, которую не могу понять.В моем коде я использую функции, которые требуют чтения карты (но не записи, а только циклический просмотр снимка существующих данных в этой карте).Вот мой код:
type MyStruct struct {
*sync.RWMutex
MyMap map[int]MyDatas
}
var MapVar = MyStruct{ &sync.RWMutex{}, make(map[int]MyDatas) }
func MyFunc() {
MapVar.Lock()
MapSnapshot := MapVar.MyMap
MapVar.Unlock()
for _, a := range MapSnapshot { // Map concurrent write/read occur here
//Some stuff
}
}
main() {
go MyFunc()
}
Функция "MyFunc" запускается в подпрограмме go, только один раз, при этом многократные запуски этой функции не выполняются.Многие другие функции обращаются к тому же «MapVar» тем же методом, и он случайным образом создает «карту одновременной записи / чтения».Я надеюсь, что кто-то объяснит мне, почему мой код неправильный.
Спасибо за ваше время.
edit: Чтобы уточнить, я просто спрашиваю, почему мой диапазон MapSnapshot производит одновременную запись / запись карты /читать.Я не могу понять, как эту карту можно использовать одновременно, так как я сохраняю реальный глобальный var (MapVar) в локальном var (MapSnapshot), используя мьютекс синхронизации.
edit: Решено.Чтобы скопировать содержимое карты в новую переменную без использования той же ссылки (и, таким образом, чтобы избежать одновременного чтения / записи карты), я должен выполнить цикл по нему и записать каждый индекс и содержимое в новую карту с циклом for.
Спасибо xpare и nilsocket.