golang

时间:2016-10-23 18:44:32

标签: go synchronization mutex

我正在寻找源代码的大猩猩上下文。我不明白它的同步,mutex.Lock,mutex.Unlock正是如此。当我从源代码中删除mutex.Lock和Mutex.Unlock时它仍在运行。

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 个答案:

答案 0 :(得分:3)

Gorrila的上下文通过地图将数据结构相互关联,但是maps are not safe for concurrent use in go

为了允许多个goroutine安全地访问同一个地图,互斥锁用于确保在任何给定时间只有一个goro对地图具有写入权限。

但是,自maps are safe for concurrent reads in go以来,RWMutex允许共享并发访问,通过拆分两个访问角色来从地图读取数据,在任何时间点都没有锁定器,单个写入锁定器或当前持有互斥锁的一个或多个读取锁定器。