#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 разрешает общий одновременный доступ для чтения данных с карты путем разделения двух ролей доступа, так что в любой момент времени либо нет шкафчиков, либо один шкафчик для записи, либо один или несколько шкафчиков для чтения, в данный момент содержащих мьютекс.