тестирование одновременного чтения карты и записи на карту - PullRequest
3 голосов
/ 25 июня 2019

Я новичок в языке го.Когда я выполняю код, я получаю следующую ошибку:
фатальная ошибка: одновременное чтение карты и запись карты

func foo() {
    var m = map[string]int{"a": 1}
    var lock = sync.RWMutex{}

    go Read(m, lock)
    time.Sleep(1 * time.Second)
    go Write(m, lock)
    time.Sleep(1 * time.Minute)
}

func main() {
    foo()
}

func Read(m map[string]int, lock sync.RWMutex) {
    for {
        read(m, lock)
    }
}

func Write(m map[string]int, lock sync.RWMutex) {
    for {
        write(m, lock)
    }
}

func read(m map[string]int, lock sync.RWMutex) {
    lock.RLock()
    defer lock.RUnlock()
    _ = m["a"]
}

func write(m map[string]int, lock sync.RWMutex) {
    lock.Lock()
    defer lock.Unlock()
    m["b"] = 2
}

кто-нибудь может сказать мне, почему?

1 Ответ

8 голосов
/ 25 июня 2019

Вы должны передать указатель на ваше значение sync.RWMutex. В противном случае вы создаете копии мьютекса каждый раз, когда передаете его новой функции, поэтому никакой реальной блокировки не происходит.

Инструмент go vet обнаружит эту ошибку за вас. Вы должны запустить go vet (и, вероятно, другие линтеры ) для всего своего кода, чтобы помочь выявить такие распространенные ошибки. Связанное чтение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...