2016-10-23 85 views
0

我正在尋找大猩猩上下文來源代碼。我不明白它做了什麼同步,mutex.Lock,mutex.Unlock。當我從源代碼中移除mutex.Lock和Mutex.Unlock時,它仍在運行。什麼是golang中的同步(sync.RWMutex)

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() 
} 

回答

3

Gorrila的上下文相關聯的數據與另一個由地圖的手段,但maps are not safe for concurrent use in go結構。

要允許多個goroutines安全地訪問相同的地圖,互斥量用於確保在任何給定時間只有一個goro具有對地圖的寫入訪問權限。

但是,由於maps are safe for concurrent reads in go,RWMutex允許共享併發訪問,通過拆分兩個訪問角色從映射中讀取數據,因此,在任何時間點,無論是沒有儲物櫃,單個寫鎖,還是一個或多個閱讀當前持有互斥鎖的儲物櫃。