Имеем:
1. map который защищён через RWMutex
2. когда читаем данные из map ставим RLock(), потом отпускаем через RUnlock()
3. когда пишем в map ставим Lock, потом отпускаем через Unlock()
Что делать если мы читаем map через цикл и в какой-то момент понимаем что этот элемент нам в map больше не нужен и его можно и нужно удалить? При этом цикл уже защищён через RLock (только на чтение, не на запись).
Варианты:
1. отпустить RLock(), взять Lock()
2. как-то по другому превратить RLock() в Lock()
3. записывать ключи удаляемых элементов в slice и проходить по ним отдельным циклом в конце блокируя map через Lock(). Минус - надо ждать, зато потом пачкой удаляются элементы.
4. сделать go l.delete(key) и вынести в эту функцию удаление с Lock/Unlock? Минусы - может быть взлёт количества горутин равное количеству элементов. При этом если есть конкурентное чтение этого map с таким же go l.delete(key) то умножаем на количество конкурентных потоков которые этот map читают, плюс ещё горсточка накопившаяся за то время пока элемент не успел удалиться.
Пример кода на скорую руку тут:
https://play.golang.org/p/5od76B-GVg
Задал аналогичный вопрос в англоязычном
https://stackoverflow.com/questions/36754838/is-it... и пишут что delete так же надо защищать через Lock, вот только не понятно как делать удаление эффективно при чтении map в цикле.
Ссылки на исходный код приветствуются, как впрочем и просто мнения.