如何在Golang中的多个变量上应用单独的Mutex?

时间:2014-11-19 15:34:06

标签: go mutex sync

我有多个变量,我想使用这种方法互相排斥

type var1WithMutex struct {
    mu       sync.Mutex
    var1     int
}
func (v *var1) Set(value int) {
    v.mu.Lock()
    v.var1 = value
    v.mu.Unlock()
}
func (v *var1) Get() (value int) {
    v.mu.Lock()
    value = v.var1
    v.mu.Unlock()
    return
}

同样有数百个变量,如var1,var2,var3 .... var100
如何在不重复此代码的情况下使所有这些内容互相排斥? 请注意,var1,var2,var3等不是数组的一部分,并且彼此之间没有任何关联。 var2可以是int,var3可以是User {}

3 个答案:

答案 0 :(得分:2)

如果它们都具有相同的接口(http://play.golang.org/p/xri2M-rtEY),您可以包装变量并使用共享的互斥锁:

type Var interface {
    Get() int
    Set(n int)
}

func Sync(v Var, m *sync.RWMutex) Var {
    return &syncedVar{
        v: v,
        m: m,
    }
}

type syncedVar struct {
    m *sync.RWMutex
    v Var
}

func (v syncedVar) Get() int {
    v.m.RLock()
    defer v.m.RUnlock()
    return v.v.Get()
}

func (v *syncedVar) Set(n int) {
    v.m.Lock()
    defer v.m.Unlock()
    v.v.Set(n)
}

答案 1 :(得分:0)

您可以为每种类型制作不同的Mutex对象。 Playground

type MutexInt struct {
    sync.Mutex
    v int
}

func (i *MutexInt) Get() int {
    return i.v
}

func (i *MutexInt) Set(v int) {
    i.v = v
}

并像这样使用

func main() {
    i := MutexInt{v: 0}
    i.Lock()
    i.Set(2)
    fmt.Println(i.Get())
    i.Unlock()
}

答案 2 :(得分:0)

如果您的变量是原始数据类型(int,float,..),请使用sync.atomic包。原子操作不需要互斥锁。