我想知道我应该在这个示例中放置互斥锁?或者两个结构都应该有互斥?
我有用于操作*设备的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
}
答案 0 :(得分:4)
实际上你应该有2个不同的互斥锁(复数是多少?),一个用于保护地图访问,另一个用于设备。
启动一些Go例程,在地图和设备上执行操作,并使用go run -race *.go
或go build -race
运行程序,99%的时间它会准确显示您需要使用锁的位置。
我建议浏览Race Detector文档。