英文:
Should I use sync.Mutex on nested structs or only on the parent?
问题
我正在为你翻译以下内容:
我想知道在这个例子中应该把互斥锁放在哪里?或者两个结构体都应该有一个互斥锁?
我有用于操作 *Device 的设置器/获取器,并且我有一个用于将设备添加到我的 State 结构体的函数。
type State struct {
Devices map[string]*Device
// 这里应该放互斥锁吗?
}
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 {
// 或者这里应该放互斥锁吗?
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
}
希望对你有帮助!
英文:
I'm wondering where I should put the mutex in the example? Or should both structs have a mutex?
I have setters/getters for manipulating a *Device and I have a function for adding Devices to my State struct.
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
得分: 4
实际上,你应该有两个不同的互斥锁(这是复数吗?),一个用于保护地图访问,另一个用于设备。
启动几个Go协程来处理地图和设备,并使用go run -race *.go
或go build -race
运行程序,99%的情况下它会准确地显示你需要使用锁的位置。
我建议你阅读竞态检测器(Race Detector)文档。
英文:
Actually you should have 2 different Mutexes (is that the plural?), one to protect the map access and one for the device.
Start few Go routines to do things on both the map and devices and run the program with go run -race *.go
or go build -race
and 99% of the time it will show you exactly where you need to use locks.
I recommend going through the Race Detector document.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论