У меня есть несколько вопросов по поводу использования Go's sync.Mutex
с struct
.Например, если бы у меня было struct
:
type something struct {
aMux sync.Mutex
a map[string]interface{}
bMux sync.Mutex
b int
}
... , было бы безопасно заблокировать bMux
и получить доступ к b
, одновременно блокируя aMux
идоступ к a
без состояния гонки?
Возможно, также полезно знать, что я обращаюсь к указателям на структуры и использую такие методы, чтобы блокировать / разблокировать мьютексы одновременно:
func (s *something) addA(k string, v interface{}) {
(*s).aMux.Lock()
(*s).a[k] = v
(*s).aMux.Unlock()
}
func (s *something) addB(k string, v interface{}) {
(*s).bMux.Lock()
(*s).b++
(*s).bMux.Unlock()
}
Я предполагаю, что это теоретически должно быть безопасно, так как вы уже можете заблокировать мьютекс в структуре, не имея доступа к полям, которые он блокирует. Но при разыменовании struct
, как указано выше, Go копирует все значения из struct
(что делает его небезопасным), или он только изменяет / извлекает указанные вами поля?
Я бы очень хотел сохранить мьютексы в одной и той же структуре, поскольку в моем коде у меня есть несколько (до шести) связанных полей в одной и той же структуре, которые я блокирую по отдельности мьютексами. Если наличие нескольких мьютексов в одной структуре (для связанных полей) безопасно, но не рекомендуется или является плохой практикой, почему?Какая структура будет лучше?