Как работать с конкурентным доступом к одной ячейке памяти?
Маленький чат (для самообучения) на GO. В пакете "server" есть "map[string]net.Conn" где хранятся все активные каналы.
Пустой канал я удаляю из памяти сразу же как оттуда выйдет последний пользователь.
В ходе тестирования заметил что 2 разных потока.. один пытается удалить пустой канал а второй пытается записать туда новое соединение.
Не понятно как с этим правильно работать..
Евгений Самсонов, Для обучения взял прямо этот гит проект тестового tcp сервера. Проблема возникла когда в func (s *server) quit(c *client) {..} добавил проверку сколько народу осталось в чате, если ноль то удаляю через delete(...) GIT REPO
P. S. Если у вас часто чтение и редко запись, то лучше будет использовать sync.RWMutex. Тогда места где чтение блокируйте с помощью RLock, а места изменения Lock
Mutexes
Наглядный график с кодом https://golangbot.com/mutex/
+ обязательно для ридеров и врайтеров использовать RLock and RUnlock (блокировка на чтение значения или на запись)
очень полезно