如何锁定地图并修复数据竞争

时间:2019-01-05 20:48:46

标签: go mutex

我正在尝试解决警告:数据竞赛 这是代码:

package models

import (
  "sync"
  "time"
)
type Stats struct {
    sync.Mutex
    request map[int64]int
}

func (s *Stats) PutRequest() {
  s.Lock()
  s.request[time.Now().Unix()]++
  s.Unlock()
}
func (s *Stats) GetRequests() map[int64]int {
    s.Lock()
    m := s.request
    s.Unlock()
    return m
 }
var Requests = Stats{
    sync.Mutex{},
    make(map[int64]int),
}

如果我将Stats字段请求更改为整数,则一切正常,但不适用于map。如何在Go中正确锁定地图?

2 个答案:

答案 0 :(得分:1)

GetRequests返回对映射的引用,因此,如果其他代码调用该函数并在不获取锁的情况下对返回的映射执行r / w,则将引入数据争用

答案 1 :(得分:0)

使用sync.RWMutex

<div>
  Some text and <span>some highlighted text<span>
</div>

func (s *Stats) PutRequest(ut int64) {
  s.Lock()
  defer s.Unlock()
  s.request[ut]++
}

在这种情况下,以下频道示例可能会很有趣。 go by example - stateful goroutines

无论如何,您都需要在返回地图之前复制地图。