что такое синхронизация (sync.RWMutex) в golang

#go #synchronization #mutex

#Вперед #синхронизация #мьютекс

Вопрос:

Я ищу контекст gorilla для исходного кода. Я не понимаю, что он делает синхронизацию, мьютекс.Блокировка, мьютекс.Разблокировать точно. он все еще работает, когда я удалил мьютекс.Блокировка и мьютекс.Разблокировка из исходных кодов.

 import (
    "net/http"
    "sync"
    "time"
)

var (
    mutex sync.RWMutex
    data  = make(map[*http.Request]map[interface{}]interface{})
    datat = make(map[*http.Request]int64)
)

// Set stores a value for a given key in a given request.
func Set(r *http.Request, key, val interface{}) {
    mutex.Lock()
    if data[r] == nil {
        data[r] = make(map[interface{}]interface{})
        datat[r] = time.Now().Unix()
    }
    data[r][key] = val
    mutex.Unlock()
}
  

Ответ №1:

Контекст Gorrila связывает структуры данных друг с другом посредством карты, но карты небезопасны для одновременного использования в go.

Чтобы разрешить нескольким подпрограммам безопасный доступ к одной и той же карте, мьютекс используется для обеспечения того, чтобы только один goro имел доступ на запись к карте в любой момент времени.

Однако, поскольку карты безопасны для одновременного чтения в go, RWMutex разрешает общий одновременный доступ для чтения данных с карты путем разделения двух ролей доступа, так что в любой момент времени либо нет шкафчиков, либо один шкафчик для записи, либо один или несколько шкафчиков для чтения, в данный момент содержащих мьютекс.