我有多个变量,我想使用这种方法互相排斥
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 {}
答案 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
包。原子操作不需要互斥锁。