我应该在嵌套结构上使用sync.Mutex还是仅在父结构上使用?

时间:2014-10-06 07:54:01

标签: go

我想知道我应该在这个示例中放置互斥锁?或者两个结构都应该有互斥?

我有用于操作*设备的setter / getters,我有一个将设备添加到我的State结构的功能。

type State struct {
    Devices map[string]*Device
    //Should the sync.Mutex be here?
}

func (s *State) AddDevice(id [4]byte, name string, features []string, state string) {
    d := NewDevice(id, name, state, "", features)

    s.Devices[d.Id()] = d
}

func NewState() *State {
    return &State{make(map[string]*Device)}
}
type Device struct {
    //Or Should the sync.Mutex be here?
    SenderId  string
    Name      string
    State     string
    Type      string
    Features  []string
    EEPs      []string
    Power     int64
    PowerUnit string
}

func (d *Device) Power() int64 {
    return d.Power
}
func (d *Device) SetPower(p int64) {
    d.Power = p
}

func NewDevice(id [4]byte, name, state, dtype string, features []string) *Device {
    d := &Device{Name: name, State: state, Type: dtype}
    d.SetId(id)
    return d
}

1 个答案:

答案 0 :(得分:4)

实际上你应该有2个不同的互斥锁(复数是多少?),一个用于保护地图访问,另一个用于设备。

启动一些Go例程,在地图和设备上执行操作,并使用go run -race *.gogo build -race运行程序,99%的时间它会准确显示您需要使用锁的位置。

我建议浏览Race Detector文档。