Задать вопрос
VGrabko
@VGrabko
Golang, Php, Js

Можно ли блокировать 1 ключ вместо всей карты?

У меня есть мап (пара миллионов ключей, постоянные обращения). Также там есть подобие сборщика мусора который проверяет время последнего использования ключа и если он стор то удаляет. После этих манипуляций запускается перерасчёт данных в этом мапе (обычный цикл). Это дело раз в 5 секунд 1 секунду не доступно (а это очень плохо). Сейчас думаю как-то сделать блокировку не всего мапа, а 1 ключа. Только вот как это уже не гуглится чёт.
  • Вопрос задан
  • 199 просмотров
Подписаться 1 Оценить 3 комментария
Решения вопроса 3
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
У меня чувство дежавю на этот вопрос. и не зря, я тебе уже отвечал на него:
Потокобезопасность и указатели. Нужны блокировки?

И ещё, на русском не говорят "карта" применительно к структуре данных map.

Ты задал уже больше 100 вопросов, ответ на 95% из них гуглится не дольше пяти секунд. Может быть ты гуглишь на русском, а не на английском, раз у тебя всё время "Только вот как это уже не гуглится чёт."
Ответ написан
Со стандартной мапой такое не прокатит. Подумайте над другой организацией данных.
Ответ написан
Комментировать
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Варианты:
1. Защищать value в map.
type MyMap map{Key]*Value
type Value struct{
sync.RWMutex
value
}

-- пара миллионов замков и добавлять/удалять записи небезогасно
2. Из функционального мира, перерасчитывать данные в новую мапу, потом подменять.
-- большая нагрузка на GarbageCollector.
3. Для вашего частного случая можно еще sync.atomic
type M map[Key]*unsafe.Pointer
type Value *YorValueType
var old, changed Value
m := make(M)
v := unsafe.Pointer(old)
m[key] = &v
old  =  (*Value)(*m[key])
changed := DoSomething(*old)
atomic.StorePointer(m["foo"], unsafe.Pointer(&changed)) //Здесь атомарно подменяется ссылка

-- много редиректов и добавлять/удалять записи небезогасно
4. Разбить мапу на куски []map[Key]Value или
map[Key1]struct{
    sync.RWMutex
    map[key2]Value
    }

блокировать только необходимые куски.
-- многоуровневый доступ, куски все равно нужно блокировать, добавлять/удалять записи небезогасно
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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