为什么这么加锁没有用!!!??

var s tsmu
func main() {
    s = tsmu{
        mu: sync.Mutex{},
        m:  make(map[int]int),
    }
    //var mu =sync.Mutex{}
    for i := 0 ; i <100;i++{

        go func(v int) {
             //s.m[v] = v
             //_ = s.m[v]
            //mu.Lock()
            //defer mu.Unlock()
             s.write(v,v)
        }(i)
    }
}
type tsmu struct {
    mu  sync.Mutex
    m   map[int]int
}
func (p tsmu)write(k,v int){
    p.mu.Lock()
    defer p.mu.Unlock()

    p.m[k] = v

}
已邀请:

goeasy

赞同来自: 嘿嘿嘿

定义write方法时,参数使用结构体指针

func (p *tsmu)write(k,v int){}

wuhan

赞同来自: jigetage

我是这样理解的:方法调用的时候会产生一个副本,使用func (p tsmu)write(k,v int)定义的方法,调用的时候会使用tsmu的值的副本,所以mutex也是副本,就不是同一个锁了。如果改成func (p * tsmu)write(k,v int) 之后,使用的是tsmu指针的副本,但指向的仍然是同一个tsmu,所以是同一个锁。

嘿嘿嘿 - it

赞同来自:

func (p *tsmu)write(k,v int){} 奇怪,这是为什么,大神能解释一下吗。

要回复问题请先登录注册