2ord
@2ord

Как правильнее избежать race condition в методах структуры в Go? Есть какие-то практики?

Написал такой код. Разумеется, не потоко-безопасный.
...
func (s *Scanner) incrExtCount(ext string) {
	_, found := s.stats.extFreq[ext]
	if found {
		s.stats.extFreq[ext]++
	} else {
		s.stats.extFreq[ext] = 1
	}
}

func (s *Scanner) addPath(path string) {
	s.stats.recentPaths.PushFront(path)
	s.stats.pathsNum++
	if s.stats.pathsNum > MaxPaths {
		s.stats.recentPaths.Remove(s.stats.recentPaths.Back())
	}
}
...

Я могу обвернуть каждую операцию чтения и записи данных (строку кода) в mutex lock/unlock, но правильно ли это?
Какой тип мьютекса стоит использовать в данном случае?
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
type GuardedScanner struct{
    s *Scanner
    *sync.Mutex //Поскольку метод всегда пишет заморачиваться с RWMutex смысла не вижу
}
func (gs *GuardedScanner) addPath(path string) {
    gs.Lock()
    gs.s.addPath(path)
    gs.Unlock()
}
//В первом методе можно обойтись sync/atomic
...
type stats struct{
...
    extFreq map[string]*uint64
...
}
func (gs *GuardedScanner) incrExtCount(ext string) {
  _, found := s.stats.extFreq[ext]
  if found {
    atomic.AddUint64(gs.stats.extFreq[ext], 1)
  } else {
    atomic.StoreUint64(gs.stats.extFreq[ext], 1)
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы